创客神器NanoPi
直播中

liliang19910310

12年用户 189经验值
擅长:模拟技术 嵌入式技术 接口/总线/驱动 EDA/IC设计
私信 关注
[话题]

【NanoPi M2试用体验】基于NanoPi M2和ZIGBEE的“QQ聊天”

       这一贴又是和ZIGBEE技术有关,基于的硬件还是CC2530,最近一直在折腾无线通信这方面的东西,所以这方面的话题就有些多了,今天的功能为QQ,QQ大家都比较熟悉了,估计初中的时候都用过,各种聊天撩妹,现在QQ用的比较少了。而本帖中的QQ则是加引号的,因为其只能实现短距离的通信,对了,如果有做无线通信或是无线传感网络的高手请多多指教,因为我有许多问题要请教,希望能够更好的学习。
       下边是ZigBee模块的实物图
IMG_20160721_210948.jpg IMG_20160721_084813.jpg
       本帖的重点似乎都有些要偏离让我适用的产品,大家习惯就好了。
       下边是ZigBee的CC2530的核心代码,是从协议栈代码例程上修改的:
  1. UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )
  2. {
  3.   (void)task_id;  // Intentionally unreferenced parameter
  4.   
  5.   if ( events & SYS_EVENT_MSG )
  6.   {
  7.     afIncomingMSGPacket_t *MSGpkt;

  8.     while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SerialApp_TaskID )) )
  9.     {
  10.       switch ( MSGpkt->hdr.event )
  11.       {
  12.       case AF_INCOMING_MSG_CMD:
  13.         SerialApp_ProcessMSGCmd( MSGpkt );    //接收到信息的消息处理函数
  14.         break;
  15.         
  16.       case ZDO_STATE_CHANGE:
  17.         SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
  18.         if ( (SampleApp_NwkState == DEV_ZB_COORD)
  19.             || (SampleApp_NwkState == DEV_ROUTER)
  20.             || (SampleApp_NwkState == DEV_END_DEVICE) )
  21.         {
  22.             // Start sending the periodic message in a regular interval.
  23.             HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
  24.             
  25.             if(SampleApp_NwkState != DEV_ZB_COORD)
  26.               SerialApp_DeviceConnect();              
  27.         }
  28.         else
  29.         {
  30.           // Device is no longer in the network
  31.         }
  32.         break;

  33.       default:
  34.         break;
  35.       }

  36.       osal_msg_deallocate( (uint8 *)MSGpkt );
  37.     }

  38.     return ( events ^ SYS_EVENT_MSG );
  39.   }

  40.   if ( events & SERIALAPP_SEND_EVT )
  41.   {
  42.     SerialApp_Send();
  43.     return ( events ^ SERIALAPP_SEND_EVT );
  44.   }

  45.   if ( events & SERIALAPP_RESP_EVT )
  46.   {
  47.     SerialApp_Resp();
  48.     return ( events ^ SERIALAPP_RESP_EVT );
  49.   }

  50.   return ( 0 );  // Discard unknown events.
  51. }
      下面是协调器接收函数代码:
  1. void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )
  2. {
  3.   uint8 stat;
  4.   uint8 seqnb;
  5.   uint8 delay;

  6.   switch ( pkt->clusterId )
  7.   {
  8.   // A message with a serial data block to be transmitted on the serial port.
  9.   case SERIALAPP_CLUSTERID1: //收到发送过来的数据通过串口输出到电脑显示
  10.     // Store the address for sending and retrying.
  11.     osal_memcpy(&SerialApp_RxAddr, &(pkt->srcAddr), sizeof( afAddrType_t ));

  12.     seqnb = pkt->cmd.Data[0];

  13.     // Keep message if not a repeat packet
  14.     if ( (seqnb > SerialApp_RxSeq) ||                    // Normal
  15.         ((seqnb < 0x80 ) && ( SerialApp_RxSeq > 0x80)) ) // Wrap-around
  16.     {
  17.         HalUARTWrite(SERIAL_APP_PORT, "kanBB: ",7);
  18.         // Transmit the data on the serial port. // 通过串口发送数据到PC机
  19.         if ( HalUARTWrite( SERIAL_APP_PORT, pkt->cmd.Data+1, (pkt->cmd.DataLength-1) ) )
  20.         {
  21.           // Save for next incoming message
  22.           SerialApp_RxSeq = seqnb;
  23.           stat = OTA_SUCCESS;
  24.           HalUARTWrite(SERIAL_APP_PORT, "n", sizeof("n"));  // 为了提高稳定性而将回车屏蔽掉
  25.         }
  26.         else
  27.         {
  28.           stat = OTA_SER_BUSY;
  29.         }
  30.     }
  31.     else
  32.     {
  33.         stat = OTA_DUP_MSG;
  34.     }

  35.     // Select approproiate OTA flow-control delay.
  36.     delay = (stat == OTA_SER_BUSY) ? SERIALAPP_NAK_DELAY : SERIALAPP_ACK_DELAY;

  37.     // Build & send OTA response message.
  38.     SerialApp_RspBuf[0] = stat;
  39.     SerialApp_RspBuf[1] = seqnb;
  40.     SerialApp_RspBuf[2] = LO_UINT16( delay );
  41.     SerialApp_RspBuf[3] = HI_UINT16( delay );
  42.     osal_set_event( SerialApp_TaskID, SERIALAPP_RESP_EVT ); //收到数据后,发送一个响应事件
  43.     osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_RESP_EVT);
  44.     break;

  45.   // A response to a received serial data block.   // 接到响应消息
  46.   case SERIALAPP_CLUSTERID2:
  47.     if ((pkt->cmd.Data[1] == SerialApp_TxSeq) &&
  48.        ((pkt->cmd.Data[0] == OTA_SUCCESS) || (pkt->cmd.Data[0] == OTA_DUP_MSG)))
  49.     {
  50.       SerialApp_TxLen = 0;
  51.       osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_SEND_EVT);
  52.     }
  53.     else
  54.     {
  55.       // Re-start timeout according to delay sent from other device.
  56.       delay = BUILD_UINT16( pkt->cmd.Data[2], pkt->cmd.Data[3] );
  57.       osal_start_timerEx( SerialApp_TaskID, SERIALAPP_SEND_EVT, delay );
  58.     }
  59.     break;

  60.     case SERIALAPP_CONNECTREQ_CLUSTER:
  61.       SerialApp_ConnectReqProcess((uint8*)pkt->cmd.Data);
  62.       
  63.     case SERIALAPP_CONNECTRSP_CLUSTER:
  64.       SerialApp_DeviceConnectRsp((uint8*)pkt->cmd.Data);
  65.       
  66.     default:
  67.       break;
  68.   }
  69. }
      下面是效果图:
IMG_20160721_082848.jpg IMG_20160721_211002.jpg IMG_20160721_211033.jpg

回帖(2)

小萃米

2016-7-25 10:05:48
哎呦很赞哦!
举报

liliang19910310

2016-7-26 19:47:45
引用: 小萃米 发表于 2016-7-25 10:05
哎呦很赞哦!

菜鸟一个,希望多多指教,共同进步
举报

更多回帖

发帖
×
20
完善资料,
赚取积分