广播实验

单播广播实验

​ 实验基于IAR Assembler for 8051 8.10.1 编程环境和粤嵌CC2530开发版,在协议栈代码上进行修改增删。

实验内容

​ 1、协调器进行广播,发送Coordinator Send!这一消息。此时led2不亮,led1闪烁。

​ 2、组网过程:首先终端所有灯都不闪烁;等稳定之后,led2闪烁;最后当终端进入到网络中,led1开始闪烁,终端对协调器单播,向协调器发送EndDevice Received!

​ 3、当终端加入到网络后,协调器由led1闪烁转换成led2闪烁,并接收终端发来的数据,经串口发送到PC机,最终显示到串口助手上。

代码分析

​ 下面将从协调器和终端两个方面进行分析

协调器

​ 协调器中有三个核心函数,分别为消息处理函数GenericApp_ProcessEvent()、数据处理函数GenericApp_MessageMSGCB()以及消息发送函数GenericApp_SendTheMessage()

GenericApp_MessageMSGCB()函数

​ 这一函数的过程为:使用osal_msg_receive函数从消息队列上接收一个消息,然后使用switch-case语句判断事件类型,如果是接收了新数据事件AF_INCOMING_MSG_CMD,则调用相应的事件处理函数,如果是接收了网络状态变化事件ZDO_STATE_CHANGE,也会做相应处理。

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );

​ 上面这一语句使用osal_msg_receive()函数从消息队列接收消息,消息包含指向接收到的无线数据包的指针,类比ESP8266中的数据包,因为zigbee是类似WiFi的一种无线通信设备。

HalLedSet(HAL_LED_2,HAL_LED_MODE_OFF); //(哪一个灯,灯的模式/状态)
HalLedBlink(HAL_LED_1,0,50,500);       //(哪一个灯,闪烁次数,在一个周期内各状态的百分比,周期)

​ 上面是协议栈提供的两个函数,HalLedSet()的功能是设置某个灯的状态,HalLedBlink()的功能是使灯闪烁。

​ HalLedBlink(HAL_LED_1,0,50,500);的意思为操作LED1,0表示一直闪烁,亮灭各占一半,周期500即500ms

case AF_INCOMING_MSG_CMD:

​ 上面代表一个事件,常用事件有:

  • AF_INCOMING_MSG_CMD 表示收到了一个新的无线数据
  • AF_DATA_CONFIRM_CMD 调用AF_DataReguest()发送数据时,有时需要确认信息,该事件与此有关
  • ZDO_STATE_CHANGE 当网络状态发生变化时,会产生该事件,如终端加入网络时,就可以通过判断该事件来决定何时向协调器发送数据包
  • ZDO_CB_MSG 指示每一个注册的ZDO响应消息
osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);
//以下是本函数的原型函数

/*********************************************************************
 * @brief  This function is called to start a timer to expire in n mSecs.
 *   When the timer expires, the calling task will get the specified event.
 *
 * @param   uint8 taskID     定时时间到达后,哪个任务对其做出响应
 * @param   uint16 event_id  事件id,定时时间到达后,该事件发生
 * @param   UNINT16 timeout_value  定时时间参数由timeout_value(以毫秒为单位)参数确定。
 *
 * @return  SUCCESS, or NO_TIMER_AVAIL.
 *********************************************************************/
uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
{
   
  halIntState_t intState;
  osalTimerRec_t *newTimer;
  HAL_ENTER_CRITICAL_SECTION( intState );  
  newTimer = osalAddTimer( taskID, event_id, timeout_value );
  HAL_EXIT_CRITICAL_SECTION( intState ); 
  return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL );
}

​ osal_start_timerEx()是一个定时函数,可以实现毫秒级的定时,定时时间到达后,发送数据到协调器,发送完数据后,再定一段时间,如此反复,实现周期性发送数据。

#define SEND_TO_ALL_EVENT 0X01  //定义新事件
return (events ^ SYS_EVENT_MSG);

​ 异或运算,可以恰好可以将处理完的事件清除,仅留下未处理的事件。

if ( events & SEND_TO_ALL_EVENT )
{
   
   GenericApp_SendTheMessage();
   osal_start_timerEx( GenericApp_TaskID,SEND_TO_ALL_EVENT,5000 );
   return( events & SEND_TO_ALL_EVENT );//清除SEND_TO_ALL_EVENT事件
}

​ 上面这一块代码表示如果SEND_TO_ALL_EVENT发生,则events & SEND_TO_ALL_EVENT非零,条件成立则执行,向终端节点发送数据,发送完整数据之后再定时5s ,最后清除这一事件。

完整代码:

//消息处理函数
UINT16 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,Android Studio 的消息广播实验可以通过以下步骤完成: 1. 创建一个新的项目 在 Android Studio 中创建一个新的项目,并在应用程序的主活动中添加以下代码: ``` public class MainActivity extends AppCompatActivity { private Button broadcastButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); broadcastButton = findViewById(R.id.broadcast_button); broadcastButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcast.MY_ACTION"); sendBroadcast(intent); } }); } } ``` 在此代码段中,我们创建了一个按钮,当用户单击按钮时,会发送一个名为“com.example.broadcast.MY_ACTION”的广播。 2. 创建一个广播接收器 在应用程序中创建一个新的广播接收器,以便我们可以接收到发送的广播。为此,请创建一个新的 Java 类,并在其中添加以下代码: ``` public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Broadcast received!", Toast.LENGTH_SHORT).show(); } } ``` 在此代码段中,我们创建了一个新的广播接收器,并在接收到广播时显示一个短暂的 Toast 消息。 3. 注册广播接收器 在 AndroidManifest.xml 文件中,添加以下内容以注册广播接收器: ``` <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="com.example.broadcast.MY_ACTION" /> </intent-filter> </receiver> ``` 在此代码段中,我们将 MyBroadcastReceiver 类注册为接收名为“com.example.broadcast.MY_ACTION”的广播。 4. 运行应用程序 现在,您可以运行应用程序并单击“发送广播”按钮。您应该能够看到一个短暂的 Toast 消息,指示广播已成功接收。 这就是 Android Studio 中消息广播实验的基本步骤。您可以根据需要进行修改和扩展,以满足您的特定需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南 城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值