Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QT bug on Write DATA to bluetooth low energy device

QT bug on Write DATA to bluetooth low energy device

Scheduled Pinned Locked Moved Unsolved General and Desktop
8 Posts 2 Posters 1.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Z Offline
    Z Offline
    Zhang_Yubiao
    wrote on last edited by
    #1

    void MainWindow::on_pushButton_send_clicked()
    {
    QByteArray array;

    for(int i=0;i<64;i++) array[i]=i;
    
    /*写入newValue作为特性的值。
    
     如果操作成功,将发射characteristicWritten()信号;
    
    低功耗设备: 每次最多写20个字节
    
    */
    
    
      m_service->writeCharacteristic(hrChar_w,array, QLowEnergyService::WriteWithoutResponse);
     // m_service->writeCharacteristic(hrChar_w,array, QLowEnergyService::WriteWithResponse);
    

    }

    When write data to bluetooth low energy device, qt output this message:
    Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.
    Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.
    Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.
    Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.

    Is it means so far qt is not suitable on this field? I used qt latest version of V5.14.2

    sierdzioS 1 Reply Last reply
    0
    • Z Zhang_Yubiao

      void MainWindow::on_pushButton_send_clicked()
      {
      QByteArray array;

      for(int i=0;i<64;i++) array[i]=i;
      
      /*写入newValue作为特性的值。
      
       如果操作成功,将发射characteristicWritten()信号;
      
      低功耗设备: 每次最多写20个字节
      
      */
      
      
        m_service->writeCharacteristic(hrChar_w,array, QLowEnergyService::WriteWithoutResponse);
       // m_service->writeCharacteristic(hrChar_w,array, QLowEnergyService::WriteWithResponse);
      

      }

      When write data to bluetooth low energy device, qt output this message:
      Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.
      Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.
      Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.
      Using QByteRef with an index pointing outside the valid range of a QByteArray. The corresponding behavior is deprecated, and will be changed in a future version of Qt.

      Is it means so far qt is not suitable on this field? I used qt latest version of V5.14.2

      sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #2

      @Zhang_Yubiao said in QT bug on Write DATA to bluetooth low energy device:

      QByteArray array;
      for(int i=0;i<64;i++) array[i]=i;

      Reserve the array's size first and warning should go away. Or use array.append(i); instead.

      (Z(:^

      1 Reply Last reply
      3
      • Z Offline
        Z Offline
        Zhang_Yubiao
        wrote on last edited by
        #3

        void MainWindow::on_pushButton_send_clicked()
        {
        QByteArray array;

        for(int i=0;i<64;i++) array.append(i); 
        
        /*写入newValue作为特性的值。
        
         如果操作成功,将发射characteristicWritten()信号;
        
        低功耗设备: 每次最多写20个字节
        
        */
        
        
          m_service->writeCharacteristic(hrChar_w,array, QLowEnergyService::WriteWithoutResponse);
         // m_service->writeCharacteristic(hrChar_w,array, QLowEnergyService::WriteWithResponse);
        

        }

        connect(m_service,&QLowEnergyService::stateChanged, this, this
        {
        if(m_service->state()==0)
        {
        qDebug() << "Write DATA cause Service invalid";
        qDebug() << "Controler state"<< m_controler->state() ;
        }
        qDebug() << "service state change" << m_service->state() << ",||||||----";

        QT output:
        13:45:48: Starting E:\BLE_DEMO\build-Bluetooth_link-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug\debug\Bluetooth_link.exe ...
        enter bludedevice constructor....
        find a new bluebooth device
        find a new bluebooth device
        device name::: "S9"
        device address::: "12:58:56:7A:4E:E5"
        device name::: "Nordic_UART"
        device address::: "DE:89:F5:DF:AB:5A"
        low Energy device ....
        low Energy device name::: "Nordic_UART"
        device name::: "Nordic_UART"
        device address::: "DE:89:F5:DF:AB:5A"
        m_controler connected ......
        list.count()= 0
        service state change QLowEnergyService::DiscoveringServices ,||||||----
        finish service discovery-----
        service state change QLowEnergyService::ServiceDiscovered ,||||||----

        Write DATA cause Service invalid
        Controler state QLowEnergyController::DiscoveredState
        service state change QLowEnergyService::InvalidService ,||||||----italicised text

        1 Reply Last reply
        0
        • sierdzioS Offline
          sierdzioS Offline
          sierdzio
          Moderators
          wrote on last edited by
          #4

          Please wrap your code between code tags, it's very hard to read.

          Your service is invalid, you need to solve that before you can start writing characteristics.

          (Z(:^

          1 Reply Last reply
          1
          • Z Offline
            Z Offline
            Zhang_Yubiao
            wrote on last edited by
            #5

            Before writing service is valid, qt can read DADA from BLE device, after writing characteristics the service became invalid,and both read & write are all invalid.

            connect(m_controler,&QLowEnergyController::serviceDiscovered, this, [this](QBluetoothUuid serviceUuid)
            {
            if(serviceUuid == QBluetoothUuid(QUuid("6e400001-b5a3-f393-e0a9-e50e24dcca9e")))
            {
            //我们用的服务类型是0xffd0对应的uuid
            //发现匹配的服务后,使用控制器对象创建服务对象
            m_service = m_controler->createServiceObject(serviceUuid,this);

               if(m_service)
               {
                 QList<QLowEnergyCharacteristic> list=m_service->characteristics();
            
                 qDebug()<<"list.count()="<<list.count();
            
                 //characteristics 获取详细特性
            
                 SendMaxMode=list.count();  //设置模式选择上限
            
            
            
                 // 服务对象创建成功后,坚挺服务状态变化,如果状态变成已发现,则进行后续服务下特征对象获取
                 connect(m_service,&QLowEnergyService::stateChanged, this, [this]()
                 {
                     if(m_service->state()==0)
                     {
                        qDebug() << "Write DATA cause Service invalid";
                        qDebug() << "Controler state"<< m_controler->state() ;
                     }
                     qDebug() << "service state change" << m_service->state() << ",||||||----";
            
            
                     //发现服务, 建立characteristic对象实例
                     if(m_service->state() == QLowEnergyService::ServiceDiscovered)
                     {
                         QLowEnergyCharacteristic hrChar = m_service->characteristic(QBluetoothUuid(QUuid("6e400003-b5a3-f393-e0a9-e50e24dcca9e")));
            
                         if(!hrChar.isValid())
                         {
                             qDebug() << "characteristic 6e400003-b5a3-f393-e0a9-e50e24dcca9e error:::";
                         }
                         // 设置特征对象可用
                         //enable the chracteristic notification by write 0x01 to client characteristic configuration
                         QLowEnergyDescriptor m_notificationDesc = hrChar.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
                         if (m_notificationDesc.isValid())
                         {
                             if(hrChar.properties() & QLowEnergyCharacteristic::Notify) {
                                  qDebug() << "";
                             }
                             m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0100"));
                         }
            
                         hrChar_w = m_service->characteristic(QBluetoothUuid(QUuid("6e400002-b5a3-f393-e0a9-e50e24dcca9e")));
            
                         if(!hrChar_w.isValid())
                         {
                             qDebug() << "characteristic 6e400002-b5a3-f393-e0a9-e50e24dcca9e error:::";
                         }
            
            
                     }
            
            
                 });
            
                 connect(m_service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)),
            
                                this, SLOT(BleServiceCharacteristicChanged(QLowEnergyCharacteristic,QByteArray)));
            
                 /*当特性值成功更改为newValue时,会发出此信号。*/
            
                 connect(m_service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray)),
            
                                this, SLOT(BleServiceCharacteristicWrite(QLowEnergyCharacteristic,QByteArray)));
            
            
                 /*服务状态改变时发出此信号。newState也可以通过state()。*/
            
                    connect(m_service, SIGNAL(stateChanged(QLowEnergyService::ServiceState)),
            
                                this, SLOT(BleServiceServiceStateChanged(QLowEnergyService::ServiceState)));
            
            1 Reply Last reply
            0
            • sierdzioS Offline
              sierdzioS Offline
              sierdzio
              Moderators
              wrote on last edited by
              #6

              Well, I don't know. Perhaps your device does not recognise that value?

              QByteArray::fromHex("0100") does not equal to 0x01.

              (Z(:^

              1 Reply Last reply
              1
              • Z Offline
                Z Offline
                Zhang_Yubiao
                wrote on last edited by
                #7

                Mobile APP can read from and write to the device. Qt only can read DATA from device.
                I don't think it's a device problem. Do you agree?

                1 Reply Last reply
                0
                • sierdzioS Offline
                  sierdzioS Offline
                  sierdzio
                  Moderators
                  wrote on last edited by
                  #8

                  Yes that suggests the device is working fine. But it still does not confirm that it will understand a byte array derived from hex representation of 0100.

                  (Z(:^

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved