Перейти к содержанию
  • Регистрация

Андрей Рулин

Пользователи
  • Публикаций

    8
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Андрей Рулин стал победителем дня 9 октября

Андрей Рулин имел наиболее популярный контент!

Информация о Андрей Рулин

  • Звание
    Новичок
  1. bytes_written := FUsbDeviceConnection.bulkTransfer({FUsbEPBO}FUsbEPII, Buffer, Size, 100); Что характерно, если так вот записать, то есть пытаться передать данные в не ту EndPoint всё равно выдаёт,что передано 3 байта. Истина, похоже где-то рядом...
  2. Я вот кстати пробовал реализовать более простой пример подключения , чем в этой библиотеке. //NewUSB:=TUSB.Create; FEpOut:=nil; Memo1.Lines.Append('Begin'); if UsbManager=nil then UsbManager:= TJvHidDeviceController.Create(Self); //usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager DeviceList := UsbManager.FUsbManager.getDeviceList; iter := DeviceList.values.iterator; while iter.hasNext do begin LocalUSBDevice := TJUSBDevice.Wrap((iter.next as ILocalObject).GetObjectID); if (LocalUSBDevice.getVendorId <> VENDOR) or (LocalUSBDevice.getproductId <> PRODUCT) then continue;//continue; Memo1.Lines.Append('Stage 1'); for i:=0 to LocalUsbDevice.getInterfaceCount-1 do begin Memo1.Lines.Append('Stage 2'); LocalUsbInterface := LocalUsbDevice.getInterface(0); if LocalUsbInterface.getInterfaceClass=3 then break; end; //Open end; if NOT UsbManager.UsbManager.hasPermission(LocalUSBDevice) then begin PermissionIntent:=TJPendingIntent.JavaClass.getBroadcast(SharedActivityContext, 0, TJIntent.JavaClass.init(StringToJString(ACTION_USB_PERMISSION)), 0); Filter := TJIntentFilter.JavaClass.init; Filter.addAction(StringToJString(ACTION_USB_PERMISSION)); FBroadcastReceiverListener := TBroadcastReceiverListener.Create(UsbManager); FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FBroadcastReceiverListener); SharedActivityContext.getApplicationContext.registerReceiver( FReceiver, Filter); UsbManager.UsbManager.requestPermission(LocalUSBDevice,PermissionIntent); exit; end; if LocalUsbInterface=nil then exit else Memo1.Lines.Append('Stage 3'); for I := 0 to LocalUsbInterface.getEndpointCount-1 do begin FUsbEP := LocalUsbInterface.getEndpoint(i); if FUsbEP.getType=3 then begin if FUsbEP.getDirection = TJUsbConstantsUSB_DIR_OUT then begin if FEpOut=nil then FEpOut := FUsbEP; end else if FUsbEP.getDirection = TJUsbConstantsUSB_DIR_IN then begin if FEpIn=nil then FEpIn := FUsbEP; end; end; end; if {(EpIn=nil) AND} (FEpOut=nil) then exit; Memo1.Lines.Append('Stage 4'); // Open device FUsbDeviceConnection := UsbManager.UsbManager.openDevice(LocalUSBDevice); if not assigned( FUsbDeviceConnection) then exit; Memo1.Lines.Append('Stage 5'); if not FUsbDeviceConnection.claimInterface(LocalUsbInterface, True) then exit; Memo1.Lines.Append('Stage 6'); btnHIDEnable.Enabled := True; btnGetSerial.Enabled := True; //FUsbDeviceConnection. Соотвественно, передача делается через S:=IntToStr(FUsbDeviceConnection.bulkTransfer(FEpOut, Buffer, {Buffer.Length}3, 0)); //можно 0 Memo1.Lines.Append('Retval = '+S); Он кстати при подключении пишет, что всё нормально. Но при попытке отправки данных увы, ничего не передаёт. Даже более того, другие программы на Java , запущенные параллельно тоже после моей не могут ничего передать.
  3. Вот например есть https://github.com/LongDirtyAnimAlf/Delphi-Android-USB-HID . К сожалению библиотека старая , не использует возможности последний версий API . И, подозреваю, глючная.
  4. В итоге для определеления имени продукта изменил код на FProductName := JStringToString(FUsbDevice.getProductName); Вместо Серийный номер так и не получилось получать.
  5. Приведу куски кода, которые , собственно эту хрень и вызывают. function THidServer.DeviceName(HidDev: TJvHidDevice): string; begin if HidDev.ProductName <> '' then Result := HidDev.ProductName else Result := Format('Device VID=%.4x PID=%.4x', [HidDev.Attributes.VendorID, HidDev.Attributes.ProductID]); if HidDev.SerialNumber <> '' then Result := Result + Format(' (Serial=%s)', [HidDev.SerialNumber]); end; Соотвественно HidDev.ProductName и HidDev.SerialNumber получаем так function TJvHidDevice.GetProductName: String; begin if FProductName = '' then begin FProductName := GetDeviceString(2); //FProductName := JStringToString(FUsbDevice.getDeviceName); end; Result := FProductName; end; function TJvHidDevice.GetSerialNumber: String; begin if FSerialNumber = '' then begin FSerialNumber:=GetDeviceString(3); //if Openfile then FSerialNumber:=JStringToString(FUsbDeviceConnection.getSerial); end; Result := FSerialNumber; end; Наконец GetDeviceString - это вот что: function TJvHidDevice.GetDeviceString(Idx: Byte): string; const STD_USB_REQUEST_GET_DESCRIPTOR = $06; STD_USB_REQUEST_GET_REPORT = $01; LIBUSB_FEATURE_REPORT = $0301; //Feature report, ID = 1 LIBUSB_DT_STRING = $03; var i,rdo:integer; rawDescs,buffer : TJavaArray<Byte>; requestidx:integer; S : String; begin if Openfile then begin rawDescs := FUsbDeviceConnection.getRawDescriptors; if (13+Idx)>rawDescs.Length then begin result:=''; exit; end; requestidx := rawDescs[13+Idx]; rawDescs.Free; buffer := TJavaArray<Byte>.Create(255); rdo := FUsbDeviceConnection.controlTransfer( (TJUsbConstantsUSB_DIR_IN OR TJUsbConstantsUSB_TYPE_STANDARD), STD_USB_REQUEST_GET_DESCRIPTOR, ((LIBUSB_DT_STRING SHL 8) OR requestidx), 0, buffer, $FF, 0); if rdo>100 then rdo:=100; if rdo<3 then begin result:=''; exit; end; S:=''; for i:=1 to (rdo-2) do begin S:=S+Char(buffer.Items[i+1]); end; result:=S; buffer.Free; end else result:=''; end; Если изменить кусок кода так чтобы в явном виде выдавался код символов. В итоге получается такой лог Arrival of #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 (Serial= #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0)
  6. Андрей Рулин

    device_filter.xml

    Устанавливая в device_filter.xml устройство, с которым хочу работать. Например для PicKIT3 ставлю <usb-device vendor-id="1240" product-id="36874"/> После этого при подключении данного устройства он предлагает выполнить мою программу. Это было ожидаемый результат. Неожидаемый результат, что если не прописать это устройство, то например выдаётся Device VID=04D8 PID=900 А если устройство прописать, то выдаётся хрень вида (Serial= ) Это что, особенность планшета? Или это потому, что я к нему не правильно подключился? Или я как-то в лог могу неправильно записывать то, что он прислал?
  7. Большое спасибо, всё заработало. Только у меня XE7, поэтому изменил параметр "Key: package"
  8. Мне надо установить две версии своей программы на один планшет. Но при установке система говорит, что это я старую пытаюсь обновить. И по итогу установлена оказывается одна(которую я последней установил). Переименование проекта не спасает, он всё равно считает, что это одна и та же программа. Как заставить систему их различать?
×
×
  • Создать...