alljoyn
alljoyn是个软件,不是拿来看的,也不是炫耀技术的,毕竟是拿来用的,用户用起来才能说好与坏。否则我们都是局外人。
这里先说说alljoyn在4004上运行的环境,alljoyn所有组件要能运行,包括操作系统,协议栈等,需要至少200多k的flash,100多kram,对CPU资源是个严重挑战,太多的ram也许你编译都不能通过,有可能你编译通过了,硬件堆栈不够用,系统也会异常。这个需要你有耐心去优化下,嵌入式系统本来就如此。其他的CPU可能会好很多,毕竟不需要这么复杂的底层系统来支持。
这里先教会大家先用起来,再去理解他。如果要想了解整个系统的运作,估计要写一本书才能够充分说明这个事情,当然这是后面的安排。这里先看看软件的处理流程:
图一:主程序
int AJ_Main(void)
{
AJ_Status status = AJ_OK;
uint8_t isUnmarshalingSuccessful = FALSE;
AJSVC_ServiceStatus serviceStatus;
AJ_Message msg;
int ipaddr;
gpio_set_pin_dir(GPIO_KEY1,1); //set input
gpio_set_pin_dir(GPIO_KEY2,1); //set input
gpio_set_pin_dir(GPIO_k1_LED,0); //set output
gpio_set_pin_dir(GPIO_K2_LED,0); //set output
gpio_set_pin_dir(GPIO_K1,0); //set output
gpio_set_pin_dir(GPIO_k2,0); //set output
//gpio_set_pin_dir(WIFI_LED,0); //set output
gpio_set_pin_low(GPIO_k1_LED);
k_msleep(1000);
k1_onoff(0);
k2_onoff(0);
set_key_interrupt();
AJ_Initialize();
AJ_AboutSetIcon(aboutIconContent, aboutIconContentSize, aboutIconMimetype, aboutIconUrl);
//About_Init(NULL,aboutIconMimetype,aboutIconContent, aboutIconContentSize, aboutIconUrl);
status = PropertyStore_Init();
if (status != AJ_OK) {
goto Exit;
}
AJ_Debug("---------ssidNameVar=%s,ssidPasswdNameVar=%s------------\n",ssidNameVar,ssidPasswdNameVar);
status = AJServices_Init(AJ_ABOUT_SERVICE_PORT, AppObjects, ProxyObjects, deviceManufactureName, deviceProductName);
if (status != AJ_OK) {
AJ_ErrPrintf(("AJServices_Init() error %s\n", (AJ_StatusText(status))));
goto Exit;
}
//AJ_RegisterObjects(AppObjects, ProxyObjects);
AJ_RegisterObjects(AppObjects, NULL);
SetBusAuthPwdCallback(MyBusAuthPwdCB);
while (TRUE) {
status = AJ_OK;
serviceStatus = AJSVC_SERVICE_STATUS_NOT_HANDLED;
if(gpio_get_pin_state(GPIO_KEY1)==0){
printf("..................GPIO_KEY1 IS LOW 1............... \n");
//goto LABLE_OTA;
//k1_onoff(3);
}
if(gpio_get_pin_state(GPIO_KEY2)==0){
printf("..................GPIO_KEY2 IS LOW............... \n");
if(key_timer++>5)
goto LABLE_OTA;
}
else
key_timer=0;
if (!isBusConnected) {
printf("..................AJRouter_Connect............... \n");
isBusConnected = AJRouter_Connect(&busAttachment, ROUTER_NAME);
if (!isBusConnected) { // Failed to connect to router?
continue; // Retry establishing connection to router.
}
}
//printf("..................AJApp_ConnectedHandler............... \n");
status = AJApp_ConnectedHandler(&busAttachment);
//printf("..................AJOBS_IsWiFiConnected............... \n");
#ifdef ONBOARDING_SERVICE
if (!AJOBS_IsWiFiConnected()) {
status = AJ_ERR_RESTART;
}
#endif
if (status == AJ_OK) {
status = AJ_UnmarshalMsg(&busAttachment, &msg, AJAPP_UNMARSHAL_TIMEOUT);
isUnmarshalingSuccessful = (status == AJ_OK);
if (status == AJ_ERR_TIMEOUT) {
if (AJ_ERR_LINK_TIMEOUT == AJ_BusLinkStateProc(&busAttachment)) {
status = AJ_ERR_READ; // something's not right. force disconnect
} else { // nothing on bus, do our own thing
//printf("..................AJApp_DoWork............... \n");
AJApp_DoWork(&busAttachment);
continue;
}
}
if (isUnmarshalingSuccessful) {
//printf("..................isUnmarshalingSuccessful............... \n");
if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) {
serviceStatus = AJApp_MessageProcessor(&busAttachment, &msg, &status);
}
if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) {
//Pass to the built-in bus message handlers
status = AJ_BusHandleBusMessage(&msg);
}
AJ_NotifyLinkActive();
}
//Unmarshaled messages must be closed to free resources
AJ_CloseMsg(&msg);
}
if (status == AJ_ERR_READ || status == AJ_ERR_RESTART || status == AJ_ERR_RESTART_APP) {
if (isBusConnected) {
AJApp_DisconnectHandler(&busAttachment, status != AJ_ERR_READ);
isBusConnected = !AJRouter_Disconnect(&busAttachment, status != AJ_ERR_READ);
if (status == AJ_ERR_RESTART_APP) {
LABLE_OTA:
ipaddr=SERVER_IP;
qca_OTA_tftp(ipaddr, "app", 1, 1);
AJ_Reboot();
}
}
}
} // while (TRUE)
return 0;
Exit:
return (1);
}
图二:调试输出
*********** start alljoyn task ***********
### MEM FREE : 25324.
000.000 aj_target_nvram.c:119 AJ_NVRAM_Init() :_AJ_EraseNVRAM
000.174 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4098. does not exist
000.181 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.189 PropertyStore.c:376 nvram read fieldIndex=2 [DeviceName] langIndex=0 [en] entry=2 val= size=33 status=AJ_OK
000.201 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4099. does not exist
000.208 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.214 PropertyStore.c:376 nvram read fieldIndex=3 [DefaultLanguage] langIndex=0 [en] entry=3 val= size=8 status=AJ_