From 8e565033fd19c4696f67862ade27f0ebbacf5682 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Tue, 27 Feb 2018 15:35:26 -0800 Subject: [PATCH] Adjusting and cleaning up ZigbeeTest to install Vigilia ZigBee gateway and devices. --- .../other/XbeePythonDriver/xbee_driver.py | 225 ++++---- .../other/ZigbeeTest/DoorlockSensor.java | 283 --------- benchmarks/other/ZigbeeTest/IoTAddress.java | 77 --- .../other/ZigbeeTest/IoTDeviceAddress.java | 138 ----- benchmarks/other/ZigbeeTest/IoTRelation.java | 105 ---- benchmarks/other/ZigbeeTest/IoTSet.java | 80 --- benchmarks/other/ZigbeeTest/IoTZigbee.java | 542 ------------------ .../other/ZigbeeTest/IoTZigbeeAddress.java | 49 -- .../other/ZigbeeTest/IoTZigbeeCallback.java | 17 - .../other/ZigbeeTest/IoTZigbeeMessage.java | 30 - .../IoTZigbeeMessageSendAddressResponse.java | 31 - ...TZigbeeMessageZclChangeSwitchResponse.java | 37 -- ...IoTZigbeeMessageZclConfigureReporting.java | 41 -- ...eMessageZclConfigureReportingResponse.java | 109 ---- .../IoTZigbeeMessageZclReadAttributes.java | 40 -- ...igbeeMessageZclReadAttributesResponse.java | 113 ---- .../IoTZigbeeMessageZclReportAttributes.java | 101 ---- ...gbeeMessageZclWriteAttributesResponse.java | 31 - ...essageZclZoneStatusChangeNotification.java | 37 -- .../IoTZigbeeMessageZdoBindResponse.java | 40 -- .../IoTZigbeeMessageZdoUnBindResponse.java | 40 -- benchmarks/other/ZigbeeTest/Makefile | 36 ++ .../other/ZigbeeTest/MoistureSensor.java | 11 - .../ZigbeeTest/MoistureSensorCallback.java | 6 - .../other/ZigbeeTest/MoistureSensorSmart.java | 12 - .../MoistureSensorSmartCallback.java | 7 - benchmarks/other/ZigbeeTest/MotionSensor.java | 225 -------- .../other/ZigbeeTest/MultipurposeSensor.java | 221 ------- .../other/ZigbeeTest/SmartthingsSensor.java | 71 --- .../ZigbeeTest/SmartthingsSensorCallback.java | 16 - benchmarks/other/ZigbeeTest/SpruceSensor.java | 217 ------- .../other/ZigbeeTest/WaterLeakSensor.java | 222 ------- benchmarks/other/ZigbeeTest/ZigbeeTest.java | 78 --- .../other/ZigbeeTest/ZigbeeTestDoorlock.class | Bin 0 -> 2887 bytes ..._doorlock.java => ZigbeeTestDoorlock.java} | 35 +- .../other/ZigbeeTest/ZigbeeTestMoisture.class | Bin 0 -> 2794 bytes .../other/ZigbeeTest/ZigbeeTestMoisture.java | 65 +++ .../other/ZigbeeTest/ZigbeeTestMotion.class | Bin 0 -> 2804 bytes ...Test_motion.java => ZigbeeTestMotion.java} | 36 +- .../ZigbeeTest/ZigbeeTestMultipurpose.class | Bin 0 -> 2828 bytes ...rpose.java => ZigbeeTestMultipurpose.java} | 35 +- .../ZigbeeTest/ZigbeeTestWaterleak.class | Bin 0 -> 2817 bytes ...aterleak.java => ZigbeeTestWaterleak.java} | 33 +- benchmarks/other/ZigbeeTest/build.bash | 3 - benchmarks/other/ZigbeeTest/buildall.bash | 11 - benchmarks/other/ZigbeeTest/clean.bash | 1 - benchmarks/other/ZigbeeTest/config.java | 15 - benchmarks/other/ZigbeeTest/run.bash | 2 - benchmarks/other/ZigbeeTest/run_doorlock.bash | 1 - benchmarks/other/ZigbeeTest/run_motion.bash | 1 - .../other/ZigbeeTest/run_multipurpose.bash | 2 - .../other/ZigbeeTest/run_waterleak.bash | 1 - benchmarks/other/ZigbeeTest/zbtest.jar | Bin 0 -> 37721 bytes iotjava/Makefile | 1 + localconfig/iotruntime/run.bash | 12 +- 55 files changed, 269 insertions(+), 3273 deletions(-) delete mode 100644 benchmarks/other/ZigbeeTest/DoorlockSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTAddress.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTDeviceAddress.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTRelation.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTSet.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbee.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeAddress.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeCallback.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessage.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageSendAddressResponse.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclChangeSwitchResponse.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReporting.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReportingResponse.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributes.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributesResponse.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReportAttributes.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclWriteAttributesResponse.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclZoneStatusChangeNotification.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoBindResponse.java delete mode 100644 benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoUnBindResponse.java create mode 100644 benchmarks/other/ZigbeeTest/Makefile delete mode 100644 benchmarks/other/ZigbeeTest/MoistureSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/MoistureSensorCallback.java delete mode 100644 benchmarks/other/ZigbeeTest/MoistureSensorSmart.java delete mode 100644 benchmarks/other/ZigbeeTest/MoistureSensorSmartCallback.java delete mode 100644 benchmarks/other/ZigbeeTest/MotionSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/MultipurposeSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/SmartthingsSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/SmartthingsSensorCallback.java delete mode 100644 benchmarks/other/ZigbeeTest/SpruceSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/WaterLeakSensor.java delete mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTest.java create mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTestDoorlock.class rename benchmarks/other/ZigbeeTest/{ZigbeeTest_doorlock.java => ZigbeeTestDoorlock.java} (60%) create mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.class create mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.java create mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTestMotion.class rename benchmarks/other/ZigbeeTest/{ZigbeeTest_motion.java => ZigbeeTestMotion.java} (59%) create mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTestMultipurpose.class rename benchmarks/other/ZigbeeTest/{ZigbeeTest_multipurpose.java => ZigbeeTestMultipurpose.java} (60%) create mode 100644 benchmarks/other/ZigbeeTest/ZigbeeTestWaterleak.class rename benchmarks/other/ZigbeeTest/{ZigbeeTest_waterleak.java => ZigbeeTestWaterleak.java} (59%) delete mode 100755 benchmarks/other/ZigbeeTest/build.bash delete mode 100755 benchmarks/other/ZigbeeTest/buildall.bash delete mode 100755 benchmarks/other/ZigbeeTest/clean.bash delete mode 100644 benchmarks/other/ZigbeeTest/config.java delete mode 100755 benchmarks/other/ZigbeeTest/run.bash delete mode 100755 benchmarks/other/ZigbeeTest/run_doorlock.bash delete mode 100755 benchmarks/other/ZigbeeTest/run_motion.bash delete mode 100755 benchmarks/other/ZigbeeTest/run_multipurpose.bash delete mode 100755 benchmarks/other/ZigbeeTest/run_waterleak.bash create mode 100644 benchmarks/other/ZigbeeTest/zbtest.jar diff --git a/benchmarks/other/XbeePythonDriver/xbee_driver.py b/benchmarks/other/XbeePythonDriver/xbee_driver.py index 955ed9c..488effe 100644 --- a/benchmarks/other/XbeePythonDriver/xbee_driver.py +++ b/benchmarks/other/XbeePythonDriver/xbee_driver.py @@ -1,3 +1,10 @@ +# ----------------------------------------------------------------------------- +# ZigBee Gateway Driver for Vigilia v.1.0 +# Created by Ali Younis +# Modified by Rahmadi Trimananda, Lee Changwoo, Jiawei +# (c) 2016-2018 University of California, Irvine +# ----------------------------------------------------------------------------- + from xbee import ZigBee import serial import time @@ -17,9 +24,7 @@ import threading UDP_RECEIVE_PORT = 5005 # port used for incoming UDP data UDP_RECEIVE_BUFFER_SIZE = 4096 # max buffer size of an incoming UDP packet SYSTEM_MASTER_ADDRESS = ("192.168.1.198", 12345) # ip address and portof the system master node -#SYSTEM_MASTER_ADDRESS = ("192.168.2.108", 22222) # ip address and portof the system master node -#SYSTEM_MASTER_ADDRESS2 = ("192.168.2.108", 11111) -#SYSTEM_MASTER_ADDRESS3 = ("192.168.2.108", 11222) +LOCAL_ADDRESS = "192.168.1.192" # local IP address # time for messages to wait for a response before the system clears away that # sequence identifier @@ -30,7 +35,6 @@ ZIGBEE_SERIAL_PORT = "/dev/ttyUSB0" ZIGBEE_SERIAL_BAUD = 115200 # Baud rate for above port # address of our local zigbee radio -#ZIGBEE_DEVICE_ADDRESS = "0013a20040d99cb4" ZIGBEE_DEVICE_ADDRESS = "xxxxxxxxxxxxxxxx" # ----------------------------------------------------------------------------- @@ -45,7 +49,7 @@ didGetLocalRadioLowAddress = False; zigbeeConnection = None zigbeeConnectionMutex = Lock() -#singleton mabe by changwoo +#singleton mabe by Changwoo matchDescriptorReqSingleton = True deviceAnnouncementSingleton = True ManagementPermitJoiningReqSuccess = False @@ -59,12 +63,12 @@ zigbeeLongShortAddrMutex = Lock() zigbeeSeqNumberToClient = dict() zigbeeSeqNumberToClientMutex = Lock() -zigeeBindRequest = dict() -zigeeBindRequestMutex = Lock() +zigbeeBindRequest = dict() +zigbeeBindRequestMutex = Lock() # Keeps record of where to send callbacks to when an HA message is received zibeeHACallback = dict() -zibeeHACallbackMutex = Lock() +zigbeeHACallbackMutex = Lock() # Keeps a record of device addresses whose short addresses have not been @@ -79,14 +83,14 @@ doEndFlag = False # 2 sockets, one for sending (not bound to a port manually) # and one for receiving, known port binding by application # both UDP sockets -sendSoceket = socket(AF_INET, SOCK_DGRAM) -receiveSoceket = socket(AF_INET, SOCK_DGRAM) +sendSocket = socket(AF_INET, SOCK_DGRAM) +receiveSocket = socket(AF_INET, SOCK_DGRAM) # zigbee address authority list zigbeeAddressAuthorityDict = dict() -# made by changwoo +# Added by Changwoo seqNumberForNotification = dict() # ----------------------------------------------------------------------------- @@ -373,7 +377,6 @@ def getConnectedRadioLongAddress(): zigbeeConnection.send('at', command="SL") # sleep for a bit to give the radio time to respond before we check again - #time.sleep(2) time.sleep(0.5) def addressUpdateWorkerMethod(): @@ -426,7 +429,6 @@ def addressUpdateWorkerMethod(): ) zigbeeConnectionMutex.release() - #time.sleep(8) time.sleep(1) @@ -445,7 +447,7 @@ def sendUdpSuccessFail(addr, packetTypeStr, packetIdStr, sucOrFail, reason=None) ''' - global sendSoceket + global sendSocket # construct the message message = "type: " + packetTypeStr.strip() + "\n" @@ -458,7 +460,7 @@ def sendUdpSuccessFail(addr, packetTypeStr, packetIdStr, sucOrFail, reason=None) message += "reason: " + reason + "\n" # send message in a UDP packet - sendSoceket.sendto(message,addr) + sendSocket.sendto(message,addr) def processUdpZdoBindReqMessage(parsedData, addr): @@ -470,7 +472,7 @@ def processUdpZdoBindReqMessage(parsedData, addr): return else: return - + # get the short address for this device long address if possible zigbeeLongShortAddrMutex.acquire() if(zigbeeLongShortAddr.has_key(parsedData['device_address_long'])): @@ -481,6 +483,7 @@ def processUdpZdoBindReqMessage(parsedData, addr): # if there is not one then we cannot since we need both the short and # the long address if(shortAddr != None): + print "> Short address exists", shortAddr # get a request number seqNumber = createSequenceNumberForClient(addr, parsedData['packet_id']) @@ -494,12 +497,12 @@ def processUdpZdoBindReqMessage(parsedData, addr): # a bind request was made so must store and wait for response # before we setup callbacks, so keep just the data we need to create the callback - zigeeBindRequestMutex.acquire() - zigeeBindRequest[seqNumber] = (parsedData['device_address_long'], + zigbeeBindRequestMutex.acquire() + zigbeeBindRequest[seqNumber] = (parsedData['device_address_long'], parsedData['cluster_id'], parsedData['packet_id'], addr) - zigeeBindRequestMutex.release() + zigbeeBindRequestMutex.release() # construct the short and long addresses of the message for sending # make sure they are in the correct format @@ -538,10 +541,10 @@ def processUdpZdoBindReqMessage(parsedData, addr): pass def processUdpZdoUnBindReqMessage(parsedData, addr): - zibeeHACallbackMutex.acquire(); + zigbeeHACallbackMutex.acquire(); if(zibeeHACallback.has_key(parsedData['device_address_long'], parsedData['cluster_id'])): zibeeHACallback(parsedData['device_address_long'], parsedData['cluster_id']).remove(addr) - zibeeHACallbackMutex.release() + zigbeeHACallbackMutex.release() sendUdpSuccessFail(addr, 'zdo_unbind_request', parsedData['packet_id'], True) @@ -556,7 +559,7 @@ def processUdpSendAddressMessage(parsedData, addr): global zigbeeLongShortAddrMutex global zigbeeUnregisteredAddresses global zigbeeUnregisteredAddressesMutex - global sendSoceket + global sendSocket print "process send address" @@ -567,7 +570,7 @@ def processUdpSendAddressMessage(parsedData, addr): message += "response: success\n" # tell client that we got their request - sendSoceket.sendto(message,addr) + sendSocket.sendto(message,addr) print "responding", message # construct @@ -586,13 +589,13 @@ def processUdpSendAddressMessage(parsedData, addr): -#made by changwoo +# Added by Changwoo def processUdpEnrollmentResponse(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection shortAddr = None @@ -658,13 +661,13 @@ def processUdpEnrollmentResponse(parsedData, addr): -#made by changwoo +# Added by Changwoo def processUdpZclWriteAttributesMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection shortAddr = None @@ -703,7 +706,6 @@ def processUdpZclWriteAttributesMessage(parsedData, addr): payloadData += '\x02' payloadData += '\x10\x00' payloadData += '\xF0' -# payloadData += '\xDA\x9A\xD9\x40\x00\xA2\x13\x00' payloadData += hexStringToZigbeeHexString(changeEndian(ZIGBEE_DEVICE_ADDRESS)) zigbeeConnectionMutex.acquire() @@ -729,13 +731,13 @@ def processUdpZclWriteAttributesMessage(parsedData, addr): sendUdpSuccessFail(addr, 'zcl_write_attributes', parsedData['packet_id'], False, 'short_address_unknown') pass -#made by changwoo +# Added by Changwoo def processUdpZclChangeSwitchReqMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection shortAddr = None @@ -799,13 +801,13 @@ def processUdpZclChangeSwitchReqMessage(parsedData, addr): pass -#made by Jiawei +# Added by Jiawei def processUdpZclLockOrUnlockDoorReqMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection shortAddr = None @@ -869,13 +871,13 @@ def processUdpZclLockOrUnlockDoorReqMessage(parsedData, addr): sendUdpSuccessFail(addr, 'lock_or_unlock_door_request', parsedData['packet_id'], False, 'short_address_unknown') -#made by Jiawei +# Added by Jiawei def processUdpZclReadDoorStatusReqMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection shortAddr = None @@ -908,9 +910,6 @@ def processUdpZclReadDoorStatusReqMessage(parsedData, addr): dstEndpoint = hexStringToZigbeeHexString(parsedData['device_endpoint']) clusterId = hexStringToZigbeeHexString(parsedData['cluster_id']) profileId = hexStringToZigbeeHexString(parsedData['profile_id']) - # framecontrol = hexStringToZigbeeHexString(parsedData['framecontrol']) - # commandframe = hexStringToZigbeeHexString(parsedData['commandframe']) - # attribute_id = hexStringToZigbeeHexString(parsedData['attribute_id']) # create and send binding command zigbeeConnectionMutex.acquire() @@ -935,13 +934,13 @@ def processUdpZclReadDoorStatusReqMessage(parsedData, addr): sendUdpSuccessFail(addr, 'read_door_status_request', parsedData['packet_id'], False, 'short_address_unknown') -# made by changwoo +# Added by Changwoo def processUdpBroadcastingRouteRecordReqMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection shortAddr = None @@ -999,13 +998,13 @@ def processUdpBroadcastingRouteRecordReqMessage(parsedData, addr): pass -#made by changwoo +# Added by Changwoo def processUdpManagementPermitJoiningReqMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection global matchDescriptorReqSingleton @@ -1079,8 +1078,8 @@ def processUdpZclReadAttributesMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection @@ -1170,8 +1169,8 @@ def processUdpZclConfigureReportingMessage(parsedData, addr): global zigbeeLongShortAddr global zigbeeLongShortAddrMutex - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection @@ -1257,7 +1256,6 @@ def processUdpPolicySet(parsedData, addr): # do nothing if wrong source - #if addr == SYSTEM_MASTER_ADDRESS or addr == SYSTEM_MASTER_ADDRESS2 or addr == SYSTEM_MASTER_ADDRESS3 : if addr == SYSTEM_MASTER_ADDRESS : key = (parsedData['ip_address'], int(parsedData['port'])) if (zigbeeAddressAuthorityDict.has_key(key)): @@ -1325,8 +1323,8 @@ def processZigbeeRxExplicitCommandMessage(parsedData): parsedData -- Pre-parsed (into a dict) data from message. ''' - global zigeeBindRequestMutex - global zigeeBindRequest + global zigbeeBindRequestMutex + global zigbeeBindRequest global zigbeeConnectionMutex global zigbeeConnection global ManagementPermitJoiningReqSuccess @@ -1352,7 +1350,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): global deviceAnnouncementSingleton global seqNumberForNotification - #made by Jiawei + # Added by Jiawei #doorlock response if (parsedData['cluster'] == '\x01\x01' and parsedData['profile'] == '\x01\x04'): zclSeqNumber = parsedData['rf_data'][1] @@ -1437,7 +1435,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): if(tup == None): # cant really do anything here return - sendSoceket.sendto(message,tup[0]) + sendSocket.sendto(message,tup[0]) elif command == '\x07': status = rfdata[3] print '' @@ -1456,7 +1454,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): if(tup == None): # cant really do anything here return - sendSoceket.sendto(message,tup[0]) + sendSocket.sendto(message,tup[0]) else: print "Configure report unsuccessfully, status =", zigbeeHexStringToHexString(status) elif(command == '\x0A'): @@ -1504,25 +1502,22 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # get callback clients to respond to callbackIndex = (zigbeeHexStringToHexString(parsedData['source_addr_long']), zigbeeHexStringToHexString(parsedData['cluster'])) retAddr = None - zibeeHACallbackMutex.acquire() + zigbeeHACallbackMutex.acquire() if(zibeeHACallback.has_key(callbackIndex)): retAddr = zibeeHACallback[callbackIndex] - zibeeHACallbackMutex.release() + zigbeeHACallbackMutex.release() # no one to respond to so do nothing here if(retAddr == None): return for ra in retAddr: - sendSoceket.sendto(message,ra) + sendSocket.sendto(message,ra) return # if this is a ZDO message/response - #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - #print parsedData - #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" if(parsedData['profile'] == '\x00\x00'): - # made by changwoo + # Added by Changwoo # if this is a Match Descriptor Request so we need to answer. if(parsedData['cluster'] == '\x00\x06' and matchDescriptorReqSingleton): zigbeeConnectionMutex.acquire() @@ -1558,7 +1553,6 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # if this is a device announcement so we can get some useful data from it elif(parsedData['cluster'] == '\x00\x13' and deviceAnnouncementSingleton): - #print parsedData # pick out the correct parts of the payload longAddr = zigbeeHexStringToHexString(parsedData['rf_data'][3:11]) shortAddr = zigbeeHexStringToHexString(parsedData['rf_data'][1:3]) @@ -1579,8 +1573,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): zigbeeUnregisteredAddresses.remove(longAddr) zigbeeUnregisteredAddressesMutex.release() - - # made by changwoo + # Added by Changwoo zigbeeConnectionMutex.acquire() zigbeeConnection.send('tx_explicit', frame_id='\x08', @@ -1606,15 +1599,15 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # get the status and sequence number from the message seqNumber = parsedData['rf_data'][0] statusCode = parsedData['rf_data'][1] - print ">response to a zdo bind_req message parsedData>" + print "> response to a zdo bind_req message parsedData" # get the bind tuple information # for this specific bind request tup = None - zigeeBindRequestMutex.acquire() - if(zigeeBindRequest.has_key(ord(seqNumber))): - tup = zigeeBindRequest[ord(seqNumber)] - zigeeBindRequestMutex.release() + zigbeeBindRequestMutex.acquire() + if(zigbeeBindRequest.has_key(ord(seqNumber))): + tup = zigbeeBindRequest[ord(seqNumber)] + zigbeeBindRequestMutex.release() if(tup == None): # cant really do anything in this case... @@ -1626,16 +1619,18 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # add a callback for this specific device and cluster # to the HA callback dict - zibeeHACallbackMutex.acquire(); + zigbeeHACallbackMutex.acquire(); if(zibeeHACallback.has_key((tup[0], tup[1]))): if(tup[3] not in zibeeHACallback[(tup[0], tup[1])]): zibeeHACallback[(tup[0], tup[1])].append(tup[3]) else: zibeeHACallback[(tup[0], tup[1])] = [tup[3]] - zibeeHACallbackMutex.release() - + zigbeeHACallbackMutex.release() + # send success message sendUdpSuccessFail(tup[3], 'zdo_bind_request', tup[2], True) + + print "> Success message sent!" # Not Supported elif (ord(statusCode) == 170): @@ -1651,7 +1646,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # if this is a response to a short address query elif(parsedData['cluster'] == '\x80\x00'): - print ">response to a short address query 0x8000" + #print ">response to a short address query 0x8000" # get a status code statusCode = parsedData['rf_data'][0] @@ -1676,13 +1671,13 @@ def processZigbeeRxExplicitCommandMessage(parsedData): zigbeeLongShortAddr[longAddr] = shortAddr zigbeeLongShortAddrMutex.release() - #made by changwoo + # Added by Changwoo elif(parsedData['cluster'] == '\x80\x06'): print '' print '[ 0x8006 ] get Match Descriptor Response' print '> rfdata : '+zigbeeHexStringToHexString(parsedData['rf_data']) - #made by changwoo + # Added by Changwoo elif(parsedData['cluster'] == '\x80\x36'): print '' print '[ 0x8036 ] get Management Permit Joining Response' @@ -1690,7 +1685,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): ManagementPermitJoiningReqSuccess = True - #made by changwoo + # Added by Changwoo else : print '' print '[ '+zigbeeHexStringToHexString(parsedData['cluster'])+' ] ...' @@ -1706,7 +1701,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): zclCommand = parsedData['rf_data'][2] zclStatus = parsedData['rf_data'][3] - #made by changwoo + # Added by Changwoo if(zclCommand == '\x00'): print '' print '> ('+zigbeeHexStringToHexString(zclStatus)+') notification! : '+ zigbeeHexStringToHexString( parsedData['rf_data'] ) @@ -1736,7 +1731,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): message += "attributes: success" message += "\n" # send the socket - sendSoceket.sendto(message,tup[0]) + sendSocket.sendto(message,tup[0]) print(">port : ", tup[0][1]) @@ -1832,13 +1827,10 @@ def processZigbeeRxExplicitCommandMessage(parsedData): message = message[0:len(message) - 1] message += "\n" # send the socket - sendSoceket.sendto(message,tup[0]) - + sendSocket.sendto(message,tup[0]) - - - # made by changwoo - # this is a zcl write attribute response + # Added by Changwoo + # this is a zcl write attribute response elif(zclCommand == '\x04'): # get the zcl payload @@ -1868,7 +1860,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): message += "attributes: success" message += "\n" # send the socket - sendSoceket.sendto(message,tup[0]) + sendSocket.sendto(message,tup[0]) print '' print '[ 0x0500 ] get Write Attribute Response success' print '> rfdata : '+zigbeeHexStringToHexString(parsedData['rf_data']) @@ -1911,7 +1903,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # if all the configurations are a success then only send back a success # based on zigbee specs message += "all_success \n"; - sendSoceket.sendto(message,tup[0]) + sendSocket.sendto(message,tup[0]) else: attibuteResponseList = [] @@ -1949,7 +1941,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): message = message[0:len(message) - 1] message += "\n" - sendSoceket.sendto(message,tup[0]) + sendSocket.sendto(message,tup[0]) # this is a zcl report attribute message elif(zclCommand == '\x0a'): @@ -1980,10 +1972,10 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # get callback clients to respond to callbackIndex = (zigbeeHexStringToHexString(parsedData['source_addr_long']), zigbeeHexStringToHexString(parsedData['cluster'])) retAddr = None - zibeeHACallbackMutex.acquire() + zigbeeHACallbackMutex.acquire() if(zibeeHACallback.has_key(callbackIndex)): retAddr = zibeeHACallback[callbackIndex] - zibeeHACallbackMutex.release() + zigbeeHACallbackMutex.release() # no one to respond to so do nothing here if(retAddr == None): @@ -2020,7 +2012,7 @@ def processZigbeeRxExplicitCommandMessage(parsedData): # send to all client that want this callback for ra in retAddr: - sendSoceket.sendto(message,ra) + sendSocket.sendto(message,ra) # ----------------------------------------------------------------------------- # Communication Callback/Parse Methods @@ -2032,20 +2024,20 @@ def handleNewZigbeeMessage(parsedData): ''' #print "==================================================================" #print '' - print "New Zigbee Message" + #print "New Zigbee Message" #printMessageData(parsedData) # dispatch to the correct zigbee handler if (parsedData['id'] == 'at_response'): - print "parsedDataID : at_response" + #print "parsedDataID : at_response" processZigbeeATCommandMessage(parsedData) elif (parsedData['id'] == 'rx_explicit'): - print "parsedDataID : rx_explicit" + #print "parsedDataID : rx_explicit" processZigbeeRxExplicitCommandMessage(parsedData) - else: - print "Unknown API format" + #else: + #print "Unknown API format" #print "==================================================================" @@ -2098,25 +2090,25 @@ def handleNewUdpPacket(data, addr): elif(parsedData["type"] == "zcl_read_attributes"): processUdpZclReadAttributesMessage(parsedData, addr) elif(parsedData["type"] == "zcl_configure_reporting"): - print "> zcl_configure_reporting call" + print "> processUdpZclConfigureReportingMessage call" processUdpZclConfigureReportingMessage(parsedData, addr) elif(parsedData["type"] == "policy_set"): processUdpPolicySet(parsedData, addr) elif(parsedData["type"] == "policy_clear"): processUdpPolicyClear(parsedData, addr) - elif(parsedData["type"] == "management_permit_joining_request"): #made by changwoo - processUdpManagementPermitJoiningReqMessage(parsedData, addr) - elif(parsedData["type"] == "zcl_write_attributes" and ManagementPermitJoiningReqSuccess): #made by changwoo + elif(parsedData["type"] == "management_permit_joining_request"): # Added by Changwoo + processUdpManagementPermitJoiningReqMessage(parsedData, addr) + elif(parsedData["type"] == "zcl_write_attributes" and ManagementPermitJoiningReqSuccess): # Added by Changwoo processUdpZclWriteAttributesMessage(parsedData, addr) - elif(parsedData["type"] == "zcl_enrollment_response"): #made by changwoo - processUdpEnrollmentResponse(parsedData, addr) - elif(parsedData["type"] == "zdo_broadcast_route_record_request"): #made by changwoo - processUdpBroadcastingRouteRecordReqMessage(parsedData, addr) - elif(parsedData["type"] == "zcl_change_switch_request"): #made by changwoo - processUdpZclChangeSwitchReqMessage(parsedData, addr) - elif(parsedData["type"] == "zcl_lock_or_unlock_door_request"): #made by Jiawei + elif(parsedData["type"] == "zcl_enrollment_response"): # Added by Changwoo + processUdpEnrollmentResponse(parsedData, addr) + elif(parsedData["type"] == "zdo_broadcast_route_record_request"): # Added by Changwoo + processUdpBroadcastingRouteRecordReqMessage(parsedData, addr) + elif(parsedData["type"] == "zcl_change_switch_request"): # Added by Changwoo + processUdpZclChangeSwitchReqMessage(parsedData, addr) + elif(parsedData["type"] == "zcl_lock_or_unlock_door_request"): # Added by Jiawei processUdpZclLockOrUnlockDoorReqMessage(parsedData, addr) - elif(parsedData["type"] == "zcl_read_door_status_request"): #made by Jiawei + elif(parsedData["type"] == "zcl_read_door_status_request"): # Added by Jiawei processUdpZclReadDoorStatusReqMessage(parsedData, addr) else: #print "unknown Packet: " + parsedData["type"] @@ -2161,8 +2153,7 @@ def main(): # setup incoming UDP socket and bind it to self and specified UDP port # sending socket does not need to be bound to anything - #receiveSoceket.bind(('192.168.2.227', UDP_RECEIVE_PORT)) - receiveSoceket.bind(('192.168.1.192', UDP_RECEIVE_PORT)) + receiveSocket.bind((LOCAL_ADDRESS, UDP_RECEIVE_PORT)) # create the thread that does short address lookups addressUpdateWorkerThread = threading.Thread(target=addressUpdateWorkerMethod) @@ -2173,12 +2164,12 @@ def main(): while(True): print "==================================================================" print '' - print "Waiting..." + print "Waiting..." print "==================================================================" # wait for an incoming UDP packet # this is a blocking call - data, addr = receiveSoceket.recvfrom(4096) + data, addr = receiveSocket.recvfrom(4096) # handle the UDP packet appropriately handleNewUdpPacket(data, addr) @@ -2200,8 +2191,8 @@ def main(): # make sure to close all the connections zigbeeConnection.halt() - receiveSoceket.close() - sendSoceket.close() + receiveSocket.close() + sendSocket.close() if __name__ == "__main__": # call main function since this is being run as the start diff --git a/benchmarks/other/ZigbeeTest/DoorlockSensor.java b/benchmarks/other/ZigbeeTest/DoorlockSensor.java deleted file mode 100644 index c069949..0000000 --- a/benchmarks/other/ZigbeeTest/DoorlockSensor.java +++ /dev/null @@ -1,283 +0,0 @@ -//package iotcode.DoorlockSensor; - -// Standard Java Packages -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Semaphore; - -// Checker annotations -//import iotchecker.qual.*; -import iotcode.annotation.*; - -// IoT Packages -import iotruntime.slave.*; -import iotcode.interfaces.*; -import iotruntime.zigbee.*; - -/** Class Smartthings sensor driver for Smartthings sensor devices. - * - * @author Changwoo Lee, Rahmadi Trimananda - * @version 1.0 - * @since 2016-12-01 - */ -public class DoorlockSensor implements IoTZigbeeCallback, SmartthingsSensor { - - private final int TIMEOUT_FOR_RESEND_MSEC = 900; - - private IoTZigbee zigConnection = null; - private boolean didClose; // make sure that the clean up was done correctly - private boolean detectStatus = false; - - private int detectedValue = 0; - private Date timestampOfLastDetecting = null; - - private AtomicBoolean didAlreadyClose = new AtomicBoolean(true); - private AtomicBoolean didAlreadyInit = new AtomicBoolean(false); - private AtomicBoolean didWriteAttrb = new AtomicBoolean(false); - private AtomicBoolean didMatchDscr = new AtomicBoolean(false); - private AtomicBoolean didBind = new AtomicBoolean(false); - private AtomicBoolean didDoorLockConfigureReporting = new AtomicBoolean(false); //made by Jiawei - static Semaphore gettingLatestDataMutex = new Semaphore(1); - - private List < SmartthingsSensorCallback > callbackList = new CopyOnWriteArrayList < SmartthingsSensorCallback > (); - - private int sensorId = 0; - - @config private IoTSet DoorlockSensorUdpAddress; // - @config private IoTSet DoorlockSensorZigbeeAddress;// - - public DoorlockSensor(IoTSet dSet, IoTSet zigSet) { - DoorlockSensorUdpAddress = dSet; - DoorlockSensorZigbeeAddress = zigSet; - } - - public DoorlockSensor() { - } - - public void init() { - - if (didAlreadyInit.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyClose.set(false); - - try { - Iterator itrUdp = DoorlockSensorUdpAddress.iterator(); - Iterator itrZig = DoorlockSensorZigbeeAddress.iterator(); - - zigConnection = new IoTZigbee((IoTDeviceAddress)itrUdp.next(), (IoTZigbeeAddress)itrZig.next()); - - // DEBUG - System.out.println("DEBUG: Allocate iterators to print out addresses!"); - Iterator itrDebugUdp = DoorlockSensorUdpAddress.iterator(); - IoTDeviceAddress iotaddDebug = (IoTDeviceAddress)itrDebugUdp.next(); - System.out.println("IP address: " + iotaddDebug.getCompleteAddress()); - System.out.println("Source port: " + iotaddDebug.getSourcePortNumber()); - System.out.println("Destination port: " + iotaddDebug.getDestinationPortNumber()); - - Iterator itrDebugZig = DoorlockSensorZigbeeAddress.iterator(); - IoTZigbeeAddress iotzbaddDebug = (IoTZigbeeAddress)itrDebugZig.next(); - System.out.println("Zigbee address: " + iotzbaddDebug.getAddress()); - - zigConnection.registerCallback(this); - System.out.println("Register callback!"); - zigConnection.init(); - System.out.println("Initialized!"); - - - - //made by changwoo - sleep(10); - - // System.out.println("BroadcastingRouteRecordRequest "); - // zigConnection.sendBroadcastingRouteRecordRequest(0x0001); - // sleep(6); - - System.out.println("Sending Management Permit Joining Request"); - // for(int z=0; z<3; z++){ - zigConnection.sendManagementPermitJoiningRequest(0x0002, 0x0036, 0x00); - sleep(0); - // } - - - while(!didBind.get()){ - System.out.println("Sending Bind Request"); - zigConnection.sendBindRequest(0x0003, 0x0101, 0x02); - sleep(0); - } - - while(!didDoorLockConfigureReporting.get()){ - System.out.println("Sending Door Lock: Configure Reporting"); - zigConnection.sendConfigureReportingCommand(0x0004, 0x0101, 0x0104, 0x01, 0x02, 0x0000, 0x30, 0x0000, 0x100E, null); - sleep(0); - } - - while(true){ - Scanner in = new Scanner(System.in); - System.out.println("\nUnlock door: 0"); - System.out.println("Lock door: 1"); - System.out.println("Read status: 2 (or anything else)"); - String str = in.next(); - if(str.equals("1")) { - System.out.println("the doorlock sensor is locking"); - zigConnection.sendLockOrUnlockDoorRequest(0x0005, 0x0101, 0x0104, 0x02, 0); - sleep(0); - }else if(str.equals("0")){ - System.out.println("the doorlock sensor is unlocking"); - zigConnection.sendLockOrUnlockDoorRequest(0x0005, 0x0101, 0x0104, 0x02, 1); - sleep(0); - }else{ - System.out.println("Let's see the doorlock sensor's status currently"); - zigConnection.sendReadDoorStatusRequest(0x0005, 0x0101, 0x0104, 0x02, 0x10, 0x00, 0x0000); - sleep(0); - } - } - - - } catch (Exception e) { - e.printStackTrace(); - } - } - - //made by changwoo - private void sleep(int multipleTime){ - if(multipleTime<=0){ - multipleTime=1; - } - try{ - Thread.sleep(TIMEOUT_FOR_RESEND_MSEC*multipleTime); - } catch(Exception e){ - e.printStackTrace(); - } - } - - // made by Jiawei - //public int getStatus() { - public int getValue() { - int tmp = 0; - - try { - gettingLatestDataMutex.acquire(); - tmp = detectedValue; - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - return tmp; - } - - public boolean isActiveValue() { - - int tmp = getValue(); - if (tmp == 1) - detectStatus = true; // Door is locked - else - detectStatus = false; // Door is not locked/not fully locked - return detectStatus; - } - - public void close() { - - if (didAlreadyClose.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyInit.set(false); - - - try { - zigConnection.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void Finalize() { - if (!didClose) { - close(); - } - } - - public void setId(int id) { - - sensorId = id; - - } - - public int getId() { - - return sensorId; - - } - - - public long getTimestampOfLastReading() { - - Date tmp = null; - try { - gettingLatestDataMutex.acquire(); - tmp = (Date)timestampOfLastDetecting.clone(); - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - long retLong = tmp.getTime(); - - return retLong; - } - - public void newMessageAvailable(IoTZigbeeMessage _zm) { - - //made by yuting - if (_zm instanceof IoTZigbeeMessageZdoBindResponse) { - IoTZigbeeMessageZdoBindResponse message = (IoTZigbeeMessageZdoBindResponse)_zm; - if (message.getSucceeded()) { - didBind.set(true); - } - } - else if (_zm instanceof IoTZigbeeMessageZclConfigureReportingResponse){ - IoTZigbeeMessageZclConfigureReportingResponse message = (IoTZigbeeMessageZclConfigureReportingResponse)_zm; - if (message.getAllSuccess()) { - didDoorLockConfigureReporting.set(true); - } - } - else if (_zm instanceof IoTZigbeeMessageZclReadAttributesResponse) { - IoTZigbeeMessageZclReadAttributesResponse message = (IoTZigbeeMessageZclReadAttributesResponse)_zm; - List attrList = message.getAttributes(); - - if (attrList.size() == 1) { - if(attrList.get(0).getAttributeId() == 0) { - byte[] data = attrList.get(0).getData(); - int value = data[0]; - - try { - gettingLatestDataMutex.acquire(); - detectedValue = value; - timestampOfLastDetecting = new Date(); - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - try { - for (SmartthingsSensorCallback cb : callbackList) { - cb.newReadingAvailable(this.getValue(), this.isActiveValue()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - } - - //public void registerCallback(SmartthingsSensorSmartCallback _callbackTo) { - public void registerCallback(SmartthingsSensorCallback _callbackTo) { - callbackList.add(_callbackTo); - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTAddress.java b/benchmarks/other/ZigbeeTest/IoTAddress.java deleted file mode 100644 index 8e82847..0000000 --- a/benchmarks/other/ZigbeeTest/IoTAddress.java +++ /dev/null @@ -1,77 +0,0 @@ - -// Java packages -import java.net.Socket; -import java.net.ServerSocket; -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** Class IoTAddress is a wrapper class to pass - * IoTSet of any addresses from master to slave - * - * @author Rahmadi Trimananda - * @version 1.0 - * @since 2016-04-22 - */ -public class IoTAddress { - - /** - * IoTDeviceAddress class properties - */ - protected final InetAddress inetAddress; - - /** - * Class constructor - * - * @param sAddress String address - */ - public IoTAddress(String sAddress) throws UnknownHostException { - - inetAddress = InetAddress.getByName(sAddress); - } - - /** - * getHostAddress() method - * - * @return String - */ - public String getHostAddress() { - - return inetAddress.getHostAddress(); - - } - - /** - * getHostName() method - * - * @return String - */ - public String getHostName() { - - return inetAddress.getHostName(); - - } - - /** - * getUrl() method - * - * @return String - */ - public String getURL(String strURLComplete) { - - //e.g. http:// + inetAddress.getHostAddress() + strURLComplete - // http://192.168.2.254/cgi-bin/mjpg/video.cgi? - return "http://" + inetAddress.getHostAddress() + strURLComplete; - - } - - /** - * getCompleteAddress() method - * - * @return String - */ - public String getCompleteAddress() { - - return inetAddress.toString(); - - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTDeviceAddress.java b/benchmarks/other/ZigbeeTest/IoTDeviceAddress.java deleted file mode 100644 index 1dff865..0000000 --- a/benchmarks/other/ZigbeeTest/IoTDeviceAddress.java +++ /dev/null @@ -1,138 +0,0 @@ - -// Java packages -import java.net.Socket; -import java.net.ServerSocket; -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** Class IoTDeviceAddress is a wrapper class to pass - * IoTSet of device addresses from master to slave - * - * @author Rahmadi Trimananda - * @version 1.0 - * @since 2016-02-18 - */ -public class IoTDeviceAddress extends IoTAddress { - - /** - * IoTDeviceAddress class properties - */ - private int iSrcPort; - private int iDstPort; - private final String sAddress; - - // the wildcard status of this address - private final boolean isSrcPortWildCard; - private final boolean isDstPortWildCard; - - - /** - * Class constructor - * - * @param sAddress String address - * @param _iSrcPort Source port number - * @param _iDstPort Destination port number - * @param _isSrcPortWildCard Is this source port a wild card (=can change port number)? - * @param _isDstPortWildCard Is this destination port a wild card (=can change port number)? - */ - public IoTDeviceAddress(String _sAddress, int _iSrcPort, int _iDstPort, boolean _isSrcPortWildCard, - boolean _isDstPortWildCard) throws UnknownHostException { - - super(_sAddress); - sAddress = _sAddress; - iSrcPort = _iSrcPort; - iDstPort = _iDstPort; - - isSrcPortWildCard = _isSrcPortWildCard; - isDstPortWildCard = _isDstPortWildCard; - } - - /** - * getSourcePortNumber() method - * - * @return int - */ - public int getSourcePortNumber() { - - return iSrcPort; - - } - - /** - * getDestinationPortNumber() method - * - * @return int - */ - public int getDestinationPortNumber() { - - return iDstPort; - - } - - /** - * setSrcPort() method - * - * @param port Port number - * @return void - */ - public void setSrcPort(int port) { - if (isSrcPortWildCard) { - iSrcPort = port; - } - } - - /** - * setDstPort() method - * - * @param port Port number - * @return void - */ - public void setDstPort(int port) { - if (isDstPortWildCard) { - iDstPort = port; - } - } - - /** - * getAddress() method - * - * @return String - */ - public String getAddress() { - return sAddress; - } - - /** - * getHostAddress() method - * - * @return String - */ - public static String getLocalHostAddress() { - - String strLocalHostAddress = null; - try { - strLocalHostAddress = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException ex) { - ex.printStackTrace(); - } - return strLocalHostAddress; - } - - /** - * getIsSrcPortWildcard() method - * - * @return boolean - */ - public boolean getIsSrcPortWildcard() { - return isSrcPortWildCard; - } - - /** - * getIsDstPortWildcard() method - * - * @return boolean - */ - public boolean getIsDstPortWildcard() { - return isDstPortWildCard; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTRelation.java b/benchmarks/other/ZigbeeTest/IoTRelation.java deleted file mode 100644 index 438b3d3..0000000 --- a/benchmarks/other/ZigbeeTest/IoTRelation.java +++ /dev/null @@ -1,105 +0,0 @@ - -import java.lang.UnsupportedOperationException; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - - -/** Class IoTRelation is the actual implementation of @config IoTRelation<...>. - * Upon extracting DB information, RelationInstrumenter class will use - * this class to actually instantiate the Map as IoTRelation uses a - * combination between a HashMap and a IoTSet; we don't provide interfaces - * to modify the contents, but we do provide means to read them out. - * The add method is just used the first time it is needed to add new objects, - * then it is going to be made immutable - * - * @author Rahmadi Trimananda - * @version 1.0 - * @since 2015-12-01 - */ -public final class IoTRelation { - - /** - * Reference to an object Map - */ - private Map > mapRelation; - private int iSize; - - /** - * Class constructor (pass the reference to this immutable wrapper) - */ - protected IoTRelation(Map> mapRel, int _iSize) { - mapRelation = mapRel; - iSize = _iSize; - } - - /** - * Method containsKey() inherited from Map interface - * - * @param key The first Object that is usually a key in a Map - * @return boolean - */ - public boolean containsKey(K key) { - - return mapRelation.containsKey(key); - - } - - /** - * Method entrySet() inherited from Map interface - * - * @return Set>> - */ - public Set>> entrySet() { - - return new HashSet>>(mapRelation.entrySet()); - - } - - /** - * Method keySet() inherited from Map interface - * - * @return Set - */ - public Set keySet() { - - return new HashSet(mapRelation.keySet()); - - } - - /** - * Method get() inherited from Map interface - * - * @param key The first Object that is usually a key in a Map - * @return HashSet - */ - public HashSet get(K key) { - - return new HashSet(mapRelation.get(key)); - - } - - /** - * Method isEmpty() inherited from Map interface - * - * @return boolean - */ - public boolean isEmpty() { - - return mapRelation.isEmpty(); - - } - - /** - * size() method - * - * @return int - */ - public int size() { - - return this.iSize; - - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTSet.java b/benchmarks/other/ZigbeeTest/IoTSet.java deleted file mode 100644 index 0f316cd..0000000 --- a/benchmarks/other/ZigbeeTest/IoTSet.java +++ /dev/null @@ -1,80 +0,0 @@ - -import java.lang.UnsupportedOperationException; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.Spliterator; - - -/** Class IoTSet is the actual implementation of @config IoTSet<...>. - * Upon extracting DB information, SetInstrumenter class will use - * this class to actually instantiate the Set as IoTSet that uses - * Java Set to implement; we don't provide interfaces to modify - * the contents, but we do provide means to read them out - * - * @author Rahmadi Trimananda - * @version 1.0 - * @since 2015-12-01 - */ -public final class IoTSet { - - /** - * Reference to an object Set - */ - private Set set; - - /** - * Class constructor (pass the reference to this immutable wrapper) - */ - public IoTSet(Set s) { - - set = s; - } - - /** - * contains() method inherited from Set interface - */ - public boolean contains(T o) { - - return set.contains(o); - - } - - /** - * isEmpty() method inherited from Set interface - */ - public boolean isEmpty() { - - return set.isEmpty(); - - } - - /** - * iterator() method inherited from Set interface - */ - public Iterator iterator() { - - return new HashSet(set).iterator(); - - } - - /** - * size() method inherited from Set interface - */ - public int size() { - - return set.size(); - - } - - /** - * values() method to return Set object values for easy iteration - */ - public Set values() { - - return new HashSet(set); - - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbee.java b/benchmarks/other/ZigbeeTest/IoTZigbee.java deleted file mode 100644 index dd12352..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbee.java +++ /dev/null @@ -1,542 +0,0 @@ - -// Java packages -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.List; -import java.util.ArrayList; -import java.util.Map; -import java.util.HashMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.Set; -import java.util.HashSet; -import java.nio.charset.StandardCharsets; -import java.util.concurrent.Semaphore; - - -/** Class IoTZigbee - * - * @author Ali Younis , Changwoo Lee - * @version 1.0 - * @since 2016-04-12, 2016-10-28 - */ -public class IoTZigbee { - - public final int SOCKET_SEND_BUFFER_SIZE = 1024; - public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; - public final int SHORT_ADDRESS_UPDATE_TIME_MSEC = 10000; - public final int SHORT_ADDRESS_UPDATE_TIME_FAST_MSEC = 500; - public final int RESEND_WAIT_TIME = 500; - - /** - * IoTZigbee class properties - */ - - // UDP connection stuff - private final String strHostAddress; - private final int iSrcPort; - private final int iDstPort; - private DatagramSocket socket; // the socket interface that we are guarding - private boolean didClose; // make sure that the clean up was done correctly - - private final IoTZigbeeAddress zigbeeAddress; - - // list that holds the callbacks - private List callbackList = new ArrayList(); - - /** - * IoTZigbee class concurrency and concurrency control - */ - private Thread receiveThread = null; - - private AtomicBoolean endTask = new AtomicBoolean(false); - private AtomicBoolean didSuccesfullySendAddress = new AtomicBoolean(false); - - /** - * Class constructor - */ - public IoTZigbee(IoTDeviceAddress iotDevAdd, IoTZigbeeAddress zigAddress) throws SocketException, IOException, InterruptedException { - - strHostAddress = iotDevAdd.getHostAddress(); - iSrcPort = iotDevAdd.getSourcePortNumber(); - iDstPort = iotDevAdd.getDestinationPortNumber(); - didClose = false; - zigbeeAddress = zigAddress; - - socket = new DatagramSocket(iSrcPort); - socket.setSendBufferSize(SOCKET_SEND_BUFFER_SIZE); - socket.setReceiveBufferSize(SOCKET_RECEIVE_BUFFER_SIZE); - - receiveThread = new Thread(new Runnable() { - public void run() { - receieveWorker(); - } - }); - receiveThread.start(); - } - - public void init() throws IOException { - while (!didSuccesfullySendAddress.get()) { - - sendDeviceAddress(); - - try { - Thread.sleep(RESEND_WAIT_TIME); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - //made by changwoo - public void sendChangeSwtichRequest(int packetId, int clusterId, int profileId, int value, int deviceEndpoint) throws IOException { - String message = "type: zcl_change_switch_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "value: " + String.format("%01x", value) + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - //made by Jiawei - public void sendLockOrUnlockDoorRequest(int packetId, int clusterId, int profileId, int deviceEndpoint, int value) throws IOException { - String message = "type: zcl_lock_or_unlock_door_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "value: " + String.format("%01x", value) + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - //made by Jiawei - public void sendReadDoorStatusRequest(int packetId, int clusterId, int profileId, int deviceEndpoint, int framecontrol, int commandframe, int attribute_id) throws IOException { - String message = "type: zcl_read_door_status_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "framecontrol: " + String.format("%02x", framecontrol) + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - message += "commandframe: " + String.format("%02x", commandframe) + "\n"; - message += "attribute_id: " + String.format("%04x", attribute_id) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - //made by changwoo - public void sendBroadcastingRouteRecordRequest(int packetId) throws IOException { - String message = "type: zdo_broadcast_route_record_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - //made by changwoo - public void sendEnrollmentResponse(int packetId, int clusterId, int profileId, int deviceEndpoint) throws IOException { - String message = "type: zcl_enrollment_response\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - //made by changwoo - public void sendWriteAttributesCommand(int packetId, int clusterId, int profileId, int deviceEndpoint) throws IOException { - String message = "type: zcl_write_attributes\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - //made by changwoo - public void sendManagementPermitJoiningRequest(int packetId, int clusterId, int deviceEndpoint) throws IOException { - String message = "type: management_permit_joining_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - public void sendBindRequest(int packetId, int clusterId, int deviceEndpoint) throws IOException { - String message = "type: zdo_bind_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - public void sendUnBindRequest(int packetId, int clusterId, int deviceEndpoint) throws IOException { - String message = "type: zdo_unbind_request\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - public void sendReadAttributesCommand(int packetId, int clusterId, int profileId, int deviceEndpoint, List attributeIds) throws IOException { - String message = "type: zcl_read_attributes\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "device_endpoint: " + String.format("%02x", deviceEndpoint) + "\n"; - - message += "attribute_ids: "; - - for (Integer i : attributeIds) { - message += String.format("%04x", i) + ","; - } - - message = message.substring(0, message.length() - 1); - message += "\n"; - - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - public void sendConfigureReportingCommand(int packetId, int clusterId, int profileId, int src_endpoint, int dest_endpoint, int attributeId, int dataType, int minReportingInterval, int maxReportingInterval, byte[] reportableChange) throws IOException { - String message = "type: zcl_configure_reporting\n"; - message += "packet_id: " + String.format("%04x", packetId) + "\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - message += "cluster_id: " + String.format("%04x", clusterId) + "\n"; - message += "profile_id: " + String.format("%04x", profileId) + "\n"; - message += "src_endpoint: " + String.format("%02x", src_endpoint) + "\n"; - message += "device_endpoint: " + String.format("%02x", dest_endpoint) + "\n"; - message += "attribute_id: " + String.format("%04x", attributeId) + "\n"; - message += "data_type: " + String.format("%02x", dataType) + "\n"; - message += "min_reporting_interval: " + String.format("%04x", minReportingInterval) + "\n"; - message += "max_reporting_interval: " + String.format("%04x", maxReportingInterval) + "\n"; - - if (reportableChange != null) { - message += "reportable_change: "; - for (Byte b : reportableChange) { - message += String.format("%02x", (int)b); - } - message += "\n"; - } - - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - public void sendConfigureReportingCommand(int packetId, int clusterId, int profileId, int dest_endpoint, int attributeId, int dataType, int minReportingInterval, int maxReportingInterval, byte[] reportableChange) throws IOException { - sendConfigureReportingCommand(packetId, clusterId, profileId, 0x00, dest_endpoint, attributeId, dataType, minReportingInterval, maxReportingInterval, reportableChange); - } - - public void registerCallback(IoTZigbeeCallback callbackTo) { - - callbackList.add(callbackTo); - - } - - public void close() throws InterruptedException { - endTask.set(true); - - // wait for the threads to end - receiveThread.join(); - - socket.close(); - didClose = true; - } - - /** - * close() called by the garbage collector right before trashing object - */ - public void Finalize() throws SocketException, InterruptedException { - - if (!didClose) { - close(); - throw new SocketException("Socket not closed before object destruction, must call close method."); - } - } - - private void sendDeviceAddress() throws IOException { - String message = "type: send_address\n"; - message += "packet_id: 00\n"; - message += "device_address_long: " + zigbeeAddress.getAddress() + "\n"; - System.out.println(message); - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(strHostAddress), iDstPort); - socket.send(sendPacket); - } - - private void receieveWorker() { - while (!(endTask.get())) { - - byte[] recBuffer = new byte[SOCKET_RECEIVE_BUFFER_SIZE]; - try { - DatagramPacket recPacket = new DatagramPacket(recBuffer, recBuffer.length); - socket.receive(recPacket); - - // Convert the UDP data into a string format - String dataString = new String(recPacket.getData()); - - // split the data by line so we can start procesisng - String[] lines = dataString.split("\n"); - - Map packetData = new HashMap(); - for (String line : lines) { - - // trim the line - String trimmedLine = line.trim(); - // make sure this is a valid data line and not just blank - if (trimmedLine.length() == 0) { - continue; - } - - // Split the data into parts - String[] parts = trimmedLine.split(":"); - parts[0] = parts[0].trim(); - parts[1] = parts[1].trim(); - packetData.put(parts[0], parts[1]); - } - - if (packetData.get("type").equals("send_address_response")) { - didSuccesfullySendAddress.set(true); - - } else { - IoTZigbeeMessage callbackMessage = null; - -/* - // made by changwoo - if (packetData.get("type").equals("zcl_match_descriptor_response")) { - System.out.println("zcl_match_descriptor_response message arrives"); - - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - boolean successOrFail = false; - if(packetData.get("attributes").equals("success")) successOrFail=true; - - callbackMessage = new IoTZigbeeMessageMatchDescriptorResponse(packetId, clusterId, profileId, successOrFail); - - } -*/ - - // made by changwoo - if (packetData.get("type").equals("zcl_zone_status_change_notification")){ - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - int status = Integer.parseInt(packetData.get("status"), 10); - boolean successOrFail = false; - if(packetData.get("attributes").equals("success")) successOrFail=true; - callbackMessage = new IoTZigbeeMessageZclZoneStatusChangeNotification(packetId, clusterId, profileId, status, successOrFail); - - // made by yuting - }else if (packetData.get("type").equals("zcl_change_switch_response")){ - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - int status = Integer.parseInt(packetData.get("status"), 10); - boolean successOrFail = false; - if(packetData.get("attributes").equals("success")) successOrFail=true; - callbackMessage = new IoTZigbeeMessageZclChangeSwitchResponse(packetId, clusterId, profileId, status, successOrFail); - - //made by changwoo - } else if (packetData.get("type").equals("zcl_write_attributes_response")) { - - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - boolean successOrFail = false; - if(packetData.get("attributes").equals("success")) successOrFail=true; - - callbackMessage = new IoTZigbeeMessageZclWriteAttributesResponse(packetId, clusterId, profileId, successOrFail); - - } else if (packetData.get("type").equals("zcl_read_attributes_response")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - - List attrList = new ArrayList(); - - String[] attributes = packetData.get("attributes").split(";"); - for (String attr : attributes) { - attr = attr.trim(); - String[] parts = attr.split(","); - - if (parts.length == 2) { - parts[0] = parts[0].trim(); - parts[1] = parts[1].trim(); - - IoTZigbeeMessageZclReadAttributesResponse.Attribute at = new IoTZigbeeMessageZclReadAttributesResponse.Attribute(Integer.parseInt(parts[0], 16), 0, false, null); - attrList.add(at); - } else { - parts[0] = parts[0].trim(); - parts[1] = parts[1].trim(); - parts[2] = parts[2].trim(); - parts[3] = parts[3].trim(); - IoTZigbeeMessageZclReadAttributesResponse.Attribute at = new IoTZigbeeMessageZclReadAttributesResponse.Attribute(Integer.parseInt(parts[0], 16), Integer.parseInt(parts[1], 16), true, hexStringToByteArray(parts[3])); - attrList.add(at); - } - } - - callbackMessage = new IoTZigbeeMessageZclReadAttributesResponse(packetId, clusterId, profileId, attrList); - - } else if (packetData.get("type").equals("zcl_configure_reporting_response")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - - if (packetData.get("attributes").equals("all_success")) { - callbackMessage = new IoTZigbeeMessageZclConfigureReportingResponse(packetId, clusterId, profileId, true, null); - } else { - List attrList = new ArrayList(); - - String[] attributes = packetData.get("attributes").split(";"); - for (String attr : attributes) { - attr = attr.trim(); - String[] parts = attr.split(","); - parts[0] = parts[0].trim(); - parts[1] = parts[1].trim(); - parts[2] = parts[2].trim(); - IoTZigbeeMessageZclConfigureReportingResponse.Attribute at = new IoTZigbeeMessageZclConfigureReportingResponse.Attribute(Integer.parseInt(parts[0], 16), parts[1].equals("success"), parts[2].equals("reported")); - attrList.add(at); - } - callbackMessage = new IoTZigbeeMessageZclConfigureReportingResponse(packetId, clusterId, profileId, false, attrList); - } - - } else if (packetData.get("type").equals("zcl_report_attributes")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - int clusterId = Integer.parseInt(packetData.get("cluster_id"), 16); - int profileId = Integer.parseInt(packetData.get("profile_id"), 16); - - List attrList = new ArrayList(); - - String[] attributes = packetData.get("attributes").split(";"); - for (String attr : attributes) { - attr = attr.trim(); - String[] parts = attr.split(","); - - parts[0] = parts[0].trim(); - parts[1] = parts[1].trim(); - parts[2] = parts[2].trim(); - IoTZigbeeMessageZclReportAttributes.Attribute at = new IoTZigbeeMessageZclReportAttributes.Attribute(Integer.parseInt(parts[0], 16), Integer.parseInt(parts[1], 16), hexStringToByteArray(parts[2])); - attrList.add(at); - } - - callbackMessage = new IoTZigbeeMessageZclReportAttributes(packetId, clusterId, profileId, attrList); - - } else if (packetData.get("type").equals("zcl_read_attributes")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - boolean success = packetData.get("response").equals("success"); - - if (success) { - callbackMessage = new IoTZigbeeMessageZclReadAttributes(packetId, success, ""); - } else { - callbackMessage = new IoTZigbeeMessageZclReadAttributes(packetId, success, packetData.get("reason")); - } - - } else if (packetData.get("type").equals("zcl_configure_reporting")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - boolean success = packetData.get("response").equals("success"); - - if (success) { - callbackMessage = new IoTZigbeeMessageZclConfigureReporting(packetId, success, ""); - } else { - callbackMessage = new IoTZigbeeMessageZclConfigureReporting(packetId, success, packetData.get("reason")); - } - - } else if (packetData.get("type").equals("zdo_bind_request")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - boolean success = packetData.get("response").equals("success"); - - if (success) { - callbackMessage = new IoTZigbeeMessageZdoBindResponse(packetId, success, ""); - } else { - callbackMessage = new IoTZigbeeMessageZdoBindResponse(packetId, success, packetData.get("reason")); - } - } - - else if (packetData.get("type").equals("zdo_unbind_request")) { - int packetId = Integer.parseInt(packetData.get("packet_id"), 16); - boolean success = packetData.get("response").equals("success"); - - if (success) { - callbackMessage = new IoTZigbeeMessageZdoUnBindResponse(packetId, success, ""); - } else { - callbackMessage = new IoTZigbeeMessageZdoUnBindResponse(packetId, success, packetData.get("reason")); - } - } - - if (callbackMessage != null) { - for (IoTZigbeeCallback c : callbackList) { - c.newMessageAvailable(callbackMessage); - } - } - } - - - - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - public static String changeHexEndianness(String hexData) { - - List pairedValues = new ArrayList(); - for (int i = 0; i < hexData.length(); i += 2) { - String part = hexData.substring(i, Math.min(i + 2, hexData.length())); - pairedValues.add(part); - } - - String retString = ""; - for (int i = (pairedValues.size() - 1); i >= 0; i--) { - retString += pairedValues.get(i); - } - return retString; - } - - // taken from: http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using-java - public static byte[] hexStringToByteArray(String s) { - int len = s.length(); - byte[] data = new byte[len / 2]; - for (int i = 0; i < len; i += 2) { - data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) - + Character.digit(s.charAt(i + 1), 16)); - } - return data; - } - -} - - - - - - - - - - - - - - - - diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeAddress.java b/benchmarks/other/ZigbeeTest/IoTZigbeeAddress.java deleted file mode 100644 index e15c518..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeAddress.java +++ /dev/null @@ -1,49 +0,0 @@ - -/** Class IoTZigbeeAddress is a wrapper class to pass - * IoTSet of device addresses from master to slave - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-12 - */ -public class IoTZigbeeAddress { - - /** - * IoTZigbeeAddress class properties - */ - private final String zigbeeAddress; - private final byte[] zigbeeAddressByteArray; - - /** - * Class constructor - * - * @param zAddress Zigbee long address - */ - public IoTZigbeeAddress(String zAddress) { - zigbeeAddress = zAddress; - // convert to byte array - zigbeeAddressByteArray = new byte[zAddress.length() / 2]; - for (int i = 0; i < zAddress.length(); i += 2) { - zigbeeAddressByteArray[i / 2] = (byte) ((Character.digit(zAddress.charAt(i), 16) << 4) - + Character.digit(zAddress.charAt(i + 1), 16)); - } - } - - /** - * getAddress() method that returns the zigbee address as a human readable String - * - * @return String - */ - public String getAddress() { - return zigbeeAddress; - } - - /** - * getAddressBytes() method that returns the zigbee address as a byte array - * - * @return byte[] - */ - public byte[] getAddressBytes() { - return zigbeeAddressByteArray; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeCallback.java b/benchmarks/other/ZigbeeTest/IoTZigbeeCallback.java deleted file mode 100644 index 94d75db..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeCallback.java +++ /dev/null @@ -1,17 +0,0 @@ - -/** Zigbee Callback for when a zigbee message is received. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-12 - */ -public interface IoTZigbeeCallback { - - /** Callback method for when data comes from the zigbee object - * - * @param zigbee message class [IoTZigbeeMessage] . - * - * @return [void] None. - */ - public void newMessageAvailable(IoTZigbeeMessage _zm); -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessage.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessage.java deleted file mode 100644 index c1df838..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessage.java +++ /dev/null @@ -1,30 +0,0 @@ - -/** Zigbee Message generic class. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessage { - - // private variables - private int packetId; - - /** - * Constructor - */ - public IoTZigbeeMessage(int _packetId) { - packetId = _packetId; - } - - - /** - * getPacketId() method that returns the packet id of the received message - * - * @return int - */ - public int getPacketId() { - return packetId; - } - -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageSendAddressResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageSendAddressResponse.java deleted file mode 100644 index cfb31c1..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageSendAddressResponse.java +++ /dev/null @@ -1,31 +0,0 @@ - - -/** Zigbee Message Send Address Response. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageSendAddressResponse extends IoTZigbeeMessage { - - // private variables - private boolean succeeded; - private String message; - - /** - * Constructor - */ - public IoTZigbeeMessageSendAddressResponse(int _packetId, boolean _succeded) { - super(_packetId); - succeeded = _succeded; - } - - /** - * getSucceeded() method that returns the success status - * - * @return boolean - */ - public boolean getSucceeded() { - return succeeded; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclChangeSwitchResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclChangeSwitchResponse.java deleted file mode 100644 index 0071d22..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclChangeSwitchResponse.java +++ /dev/null @@ -1,37 +0,0 @@ -/** Zigbee Message Zcl Change Switch Response - * - * @author Yuting Tan - * @version 1.0 - * @since 2017-2-28 - */ -public class IoTZigbeeMessageZclChangeSwitchResponse extends IoTZigbeeMessage { - - private boolean SuccessOrFail=false; - private int clusterId; - private int profileId; - private int status; - - public IoTZigbeeMessageZclChangeSwitchResponse(int _packetId, int _clusterId, int _profileId, int _status, boolean _SuccessOrFail){ - super(_packetId); - - clusterId = _clusterId; - profileId = _profileId; - status = _status; - SuccessOrFail = _SuccessOrFail; - } - public boolean getSuccessOrFail(){ - return SuccessOrFail; - } - - public int getClusterId() { - return clusterId; - } - - public int getProfileId() { - return profileId; - } - - public int getStatus(){ - return status; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReporting.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReporting.java deleted file mode 100644 index 60a98cb..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReporting.java +++ /dev/null @@ -1,41 +0,0 @@ - -/** Zigbee Message Zcl Configure Reporting. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageZclConfigureReporting extends IoTZigbeeMessage { - - // private variables - private boolean succeeded; - private String message; - - /** - * Constructor - */ - public IoTZigbeeMessageZclConfigureReporting(int _packetId, boolean _succeded, String _message) { - super(_packetId); - message = _message; - succeeded = _succeded; - } - - - /** - * getSucceeded() method that returns the success status - * - * @return boolean - */ - public boolean getSucceeded() { - return succeeded; - } - - /** - * getMessage() method that returns the error message - * - * @return String - */ - public String getMessage() { - return message; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReportingResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReportingResponse.java deleted file mode 100644 index 05fda4b..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclConfigureReportingResponse.java +++ /dev/null @@ -1,109 +0,0 @@ - -import java.util.List; - -/** Zigbee Message Zcl Configure Reporting Response. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageZclConfigureReportingResponse extends IoTZigbeeMessage { - - static public class Attribute { - - // private variables - private int attributeId; - private boolean successOrFail; - private boolean isReport; - - /** - * Constructor - */ - public Attribute(int _attributeId, boolean _successOrFail, boolean _isReport) { - attributeId = _attributeId; - successOrFail = _successOrFail; - isReport = _isReport; - } - - /** - * getAttributeId() method that returns attribute id - * - * @return int - */ - public int getAttributeId() { - return attributeId; - } - - /** - * getIsReport() method that gets if the direction is report of receive - * - * @return boolean - */ - public boolean getIsReport() { - return isReport; - } - - /** - * getSuccessOrFail() method is if the configure for this attribute failed or succeeded - * - * @return boolean - */ - public boolean getSuccessOrFail() { - return successOrFail; - } - } - - // private variables - private int clusterId; - private int profileId; - private boolean allSuccess; - private List attributes; - - /** - * Constructor - */ - public IoTZigbeeMessageZclConfigureReportingResponse(int _packetId, int _clusterId, int _profileId, boolean _allSuccess, List _attributes) { - super(_packetId); - - clusterId = _clusterId; - profileId = _profileId; - allSuccess = _allSuccess; - attributes = _attributes; - } - - /** - * getAllSuccess() method that returns if all the configurations succeeded - * - * @return boolean - */ - public boolean getAllSuccess() { - return allSuccess; - } - - /** - * getClusterId() method that returns the cluster id - * - * @return int - */ - public int getClusterId() { - return clusterId; - } - - /** - * getProfileId() method that returns the profile id - * - * @return int - */ - public int getProfileId() { - return profileId; - } - - /** - * getAttributes() method that returns if all attributes if one of there was a failure to configure - * - * @return List - */ - public List getAttributes() { - return attributes; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributes.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributes.java deleted file mode 100644 index bb20d9d..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributes.java +++ /dev/null @@ -1,40 +0,0 @@ - -/** Zigbee Message Zcl Read Attributes. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageZclReadAttributes extends IoTZigbeeMessage { - - // private variables - private boolean succeeded; - private String message; - - /** - * Constructor - */ - public IoTZigbeeMessageZclReadAttributes(int _packetId, boolean _succeded, String _message) { - super(_packetId); - message = _message; - succeeded = _succeded; - } - - /** - * getSucceeded() method that returns the success status - * - * @return boolean - */ - public boolean getSucceeded() { - return succeeded; - } - - /** - * getMessage() method that returns the error message - * - * @return String - */ - public String getMessage() { - return message; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributesResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributesResponse.java deleted file mode 100644 index bd6f75a..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReadAttributesResponse.java +++ /dev/null @@ -1,113 +0,0 @@ - -import java.util.List; - -/** Zigbee Message Zcl Read Attributes Response. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageZclReadAttributesResponse extends IoTZigbeeMessage { - - static class Attribute { - - // private variables - private int attributeId; - private int dataType; - private boolean successOrFail; - private byte[] data; - - /** - * Constructor - */ - public Attribute(int _attributeId, int _dataType, boolean _successOrFail, byte[] _data) { - attributeId = _attributeId; - dataType = _dataType; - successOrFail = _successOrFail; - data = _data; - } - - - /** - * getAttributeId() method that returns attribute id - * - * @return int - */ - public int getAttributeId() { - return attributeId; - } - - - /** - * getDataType() method that returns attribute data type - * - * @return int - */ - public int getDataType() { - return dataType; - } - - - /** - * getSuccessOrFail() method is if the configure for this attribute failed or succeeded - * - * @return boolean - */ - public boolean getSuccessOrFail() { - return successOrFail; - } - - - /** - * getData() method that returns attribute data - * - * @return byte[] - */ - public byte[] getData() { - return data; - } - } - - // private variables - private int clusterId; - private int profileId; - private List attributes; - - /** - * Constructor - */ - public IoTZigbeeMessageZclReadAttributesResponse(int _packetId, int _clusterId, int _profileId, List _attributes) { - super(_packetId); - - clusterId = _clusterId; - profileId = _profileId; - attributes = _attributes; - } - - /** - * getClusterId() method that returns the cluster id - * - * @return int - */ - public int getClusterId() { - return clusterId; - } - - /** - * getProfileId() method that returns the profile id - * - * @return int - */ - public int getProfileId() { - return profileId; - } - - /** - * getAttributes() method that returns all attributes data - * - * @return List - */ - public List getAttributes() { - return attributes; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReportAttributes.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReportAttributes.java deleted file mode 100644 index de1bfd0..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclReportAttributes.java +++ /dev/null @@ -1,101 +0,0 @@ - -import java.util.List; - -/** Zigbee Message Zcl Report Attributes. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageZclReportAttributes extends IoTZigbeeMessage { - - static public class Attribute { - - // private variables - private int attributeId; - private int dataType; - private byte[] data; - - /** - * Constructor - */ - public Attribute(int _attributeId, int _dataType, byte[] _data) { - attributeId = _attributeId; - dataType = _dataType; - data = _data; - } - - /** - * getAttributeId() method that returns attribute id - * - * @return int - */ - public int getAttributeId() { - return attributeId; - } - - - /** - * getDataType() method that returns attribute data type - * - * @return int - */ - public int getDataType() { - return dataType; - } - - - /** - * getData() method that returns attribute data - * - * @return byte[] - */ - public byte[] getData() { - return data; - } - - } - - // private variables - private int clusterId; - private int profileId; - private List attributes; - - /** - * Constructor - */ - public IoTZigbeeMessageZclReportAttributes(int _packetId, int _clusterId, int _profileId, List _attributes) { - super(_packetId); - - clusterId = _clusterId; - profileId = _profileId; - attributes = _attributes; - } - - /** - * getClusterId() method that returns the cluster id - * - * @return int - */ - public int getClusterId() { - return clusterId; - } - - /** - * getProfileId() method that returns the profile id - * - * @return int - */ - public int getProfileId() { - return profileId; - } - - /** - * getAttributes() method that returns all attributes data - * - * @return List - */ - public List getAttributes() { - return attributes; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclWriteAttributesResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclWriteAttributesResponse.java deleted file mode 100644 index ac045c8..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclWriteAttributesResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -/** Zigbee Message Zcl Write Attributes Response. - * - * @author changwoo Lee - * @version 1.0 - * @since 2016-10-18 - */ -public class IoTZigbeeMessageZclWriteAttributesResponse extends IoTZigbeeMessage { - - private boolean SuccessOrFail=false; - private int clusterId; - private int profileId; - - public IoTZigbeeMessageZclWriteAttributesResponse(int _packetId, int _clusterId, int _profileId, boolean _SuccessOrFail){ - super(_packetId); - - clusterId = _clusterId; - profileId = _profileId; - SuccessOrFail = _SuccessOrFail; - } - public boolean getSuccessOrFail(){ - return SuccessOrFail; - } - - public int getClusterId() { - return clusterId; - } - - public int getProfileId() { - return profileId; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclZoneStatusChangeNotification.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclZoneStatusChangeNotification.java deleted file mode 100644 index fd633fe..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZclZoneStatusChangeNotification.java +++ /dev/null @@ -1,37 +0,0 @@ -/** Zigbee Message Zcl Zone Status Change Notification. - * - * @author changwoo Lee - * @version 1.0 - * @since 2016-10-28 - */ -public class IoTZigbeeMessageZclZoneStatusChangeNotification extends IoTZigbeeMessage { - - private boolean SuccessOrFail=false; - private int clusterId; - private int profileId; - private int status; - - public IoTZigbeeMessageZclZoneStatusChangeNotification(int _packetId, int _clusterId, int _profileId, int _status, boolean _SuccessOrFail){ - super(_packetId); - - clusterId = _clusterId; - profileId = _profileId; - status = _status; - SuccessOrFail = _SuccessOrFail; - } - public boolean getSuccessOrFail(){ - return SuccessOrFail; - } - - public int getClusterId() { - return clusterId; - } - - public int getProfileId() { - return profileId; - } - - public int getStatus(){ - return status; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoBindResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoBindResponse.java deleted file mode 100644 index f1d27d4..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoBindResponse.java +++ /dev/null @@ -1,40 +0,0 @@ - -/** Zigbee Message Zdo Bind Response. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-04-19 - */ -public class IoTZigbeeMessageZdoBindResponse extends IoTZigbeeMessage { - - // private variables - private boolean succeeded; - private String message; - - /** - * Constructor - */ - public IoTZigbeeMessageZdoBindResponse(int _packetId, boolean _succeded, String _message) { - super(_packetId); - message = _message; - succeeded = _succeded; - } - - /** - * getSucceeded() method that returns the success status - * - * @return boolean - */ - public boolean getSucceeded() { - return succeeded; - } - - /** - * getMessage() method that returns the error message - * - * @return String - */ - public String getMessage() { - return message; - } -} diff --git a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoUnBindResponse.java b/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoUnBindResponse.java deleted file mode 100644 index edb5534..0000000 --- a/benchmarks/other/ZigbeeTest/IoTZigbeeMessageZdoUnBindResponse.java +++ /dev/null @@ -1,40 +0,0 @@ - -/** Zigbee Message Zdo UnBind Response. - * - * @author Ali Younis - * @version 1.0 - * @since 2016-05-04 - */ -public class IoTZigbeeMessageZdoUnBindResponse extends IoTZigbeeMessage { - - // private variables - private boolean succeeded; - private String message; - - /** - * Constructor - */ - public IoTZigbeeMessageZdoUnBindResponse(int _packetId, boolean _succeded, String _message) { - super(_packetId); - message = _message; - succeeded = _succeded; - } - - /** - * getSucceeded() method that returns the success status - * - * @return boolean - */ - public boolean getSucceeded() { - return succeeded; - } - - /** - * getMessage() method that returns the error message - * - * @return String - */ - public String getMessage() { - return message; - } -} diff --git a/benchmarks/other/ZigbeeTest/Makefile b/benchmarks/other/ZigbeeTest/Makefile new file mode 100644 index 0000000..a425dab --- /dev/null +++ b/benchmarks/other/ZigbeeTest/Makefile @@ -0,0 +1,36 @@ + +BASE := ../../../ + +include $(BASE)/common.mk + +all: build + +PHONY += build +build: + javac -cp ./zbtest.jar:. *.java + +PHONY += clean +clean: + rm -rf *.class + +PHONY += run-moisture +run-moisture: + java -cp ./zbtest.jar:. ZigbeeTestMoisture + +PHONY += run-motion +run-motion: + java -cp ./zbtest.jar:. ZigbeeTestMotion + +PHONY += run-multipurpose +run-multipurpose: + java -cp ./zbtest.jar:. ZigbeeTestMultipurpose + +PHONY += run-waterleak +run-waterleak: + java -cp ./zbtest.jar:. ZigbeeTestWaterleak + +PHONY += run-doorlock +run-doorlock: + java -cp ./zbtest.jar:. ZigbeeTestDoorlock + +.PHONY: $(PHONY) diff --git a/benchmarks/other/ZigbeeTest/MoistureSensor.java b/benchmarks/other/ZigbeeTest/MoistureSensor.java deleted file mode 100644 index 573bd70..0000000 --- a/benchmarks/other/ZigbeeTest/MoistureSensor.java +++ /dev/null @@ -1,11 +0,0 @@ -import java.util.List; -import java.util.ArrayList; - -public interface MoistureSensor { - public void init(); - public float getMoisture(); - public long getTimestampOfLastReading(); - public void setId(int id); - public int getId(); - public void registerCallback(MoistureSensorSmartCallback _callbackTo); -} diff --git a/benchmarks/other/ZigbeeTest/MoistureSensorCallback.java b/benchmarks/other/ZigbeeTest/MoistureSensorCallback.java deleted file mode 100644 index d45e698..0000000 --- a/benchmarks/other/ZigbeeTest/MoistureSensorCallback.java +++ /dev/null @@ -1,6 +0,0 @@ -import java.util.List; -import java.util.ArrayList; - -public interface MoistureSensorCallback { - public void newReadingAvailable(int sensorId, float moisture, long timeStampOfLastReading); -} diff --git a/benchmarks/other/ZigbeeTest/MoistureSensorSmart.java b/benchmarks/other/ZigbeeTest/MoistureSensorSmart.java deleted file mode 100644 index 1496146..0000000 --- a/benchmarks/other/ZigbeeTest/MoistureSensorSmart.java +++ /dev/null @@ -1,12 +0,0 @@ -import java.util.List; -import java.util.ArrayList; - -public interface MoistureSensorSmart { - - public long getTimestampOfLastReading(); - public int getId(); - public void registerCallback(MoistureSensorCallback _callbackTo); - public float getMoisture(); - public void setId(int id); - public void init(); -} diff --git a/benchmarks/other/ZigbeeTest/MoistureSensorSmartCallback.java b/benchmarks/other/ZigbeeTest/MoistureSensorSmartCallback.java deleted file mode 100644 index c69e9cc..0000000 --- a/benchmarks/other/ZigbeeTest/MoistureSensorSmartCallback.java +++ /dev/null @@ -1,7 +0,0 @@ -import java.util.List; -import java.util.ArrayList; - -public interface MoistureSensorSmartCallback { - - public void newReadingAvailable(int sensorId, float moisture, long timeStampOfLastReading); -} diff --git a/benchmarks/other/ZigbeeTest/MotionSensor.java b/benchmarks/other/ZigbeeTest/MotionSensor.java deleted file mode 100644 index 5fe888a..0000000 --- a/benchmarks/other/ZigbeeTest/MotionSensor.java +++ /dev/null @@ -1,225 +0,0 @@ -// Standard Java Packages -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Semaphore; - -// Checker annotations -//import iotchecker.qual.*; -//import iotcode.annotation.*; - -// IoT Packages -import iotruntime.slave.*; -//import iotcode.interfaces.*; -import iotruntime.zigbee.*; - -/** Class Smartthings sensor driver for Smartthings sensor devices. - * - * @author Changwoo Lee, Rahmadi Trimananda - * @version 1.0 - * @since 2016-12-01 - */ -public class MotionSensor implements IoTZigbeeCallback, SmartthingsSensor { - - private final int TIMEOUT_FOR_RESEND_MSEC = 900; - - private IoTZigbee zigConnection = null; - private boolean didClose; // make sure that the clean up was done correctly - private boolean detectStatus = false; - - private int detectedValue = 0; - private Date timestampOfLastDetecting = null; - - private AtomicBoolean didAlreadyClose = new AtomicBoolean(true); - private AtomicBoolean didAlreadyInit = new AtomicBoolean(false); - private AtomicBoolean didWriteAttrb = new AtomicBoolean(false); - private AtomicBoolean didMatchDscr = new AtomicBoolean(false); - static Semaphore gettingLatestDataMutex = new Semaphore(1); - - private List < SmartthingsSensorCallback > callbackList = new CopyOnWriteArrayList < SmartthingsSensorCallback > (); - - @config private IoTSet devUdpAddress; - @config private IoTSet devZigbeeAddress; - - public MotionSensor(IoTSet dSet, IoTSet zigSet) { - devUdpAddress = dSet; - devZigbeeAddress = zigSet; - } - - public void init() { - - if (didAlreadyInit.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyClose.set(false); - - try { - Iterator itrUdp = devUdpAddress.iterator(); - Iterator itrZig = devZigbeeAddress.iterator(); - - zigConnection = new IoTZigbee((IoTDeviceAddress)itrUdp.next(), (IoTZigbeeAddress)itrZig.next()); - - // DEBUG - System.out.println("DEBUG: Allocate iterators to print out addresses!"); - Iterator itrDebugUdp = devUdpAddress.iterator(); - IoTDeviceAddress iotaddDebug = (IoTDeviceAddress)itrDebugUdp.next(); - System.out.println("IP address: " + iotaddDebug.getCompleteAddress()); - System.out.println("Source port: " + iotaddDebug.getSourcePortNumber()); - System.out.println("Destination port: " + iotaddDebug.getDestinationPortNumber()); - - Iterator itrDebugZig = devZigbeeAddress.iterator(); - IoTZigbeeAddress iotzbaddDebug = (IoTZigbeeAddress)itrDebugZig.next(); - System.out.println("Zigbee address: " + iotzbaddDebug.getAddress()); - - zigConnection.registerCallback(this); - System.out.println("Register callback!"); - zigConnection.init(); - System.out.println("Initialized!"); - - //made by changwoo - sleep(10); - - //System.out.println("Sending Management Permit Joining Request"); - for(int z=0; z<3; z++){ - zigConnection.sendManagementPermitJoiningRequest(0x0001, 0x0036, 0x00); - System.out.println("Sending Management Permit Joining Request"); - sleep(0); - } - - //made by changwoo - while (!didWriteAttrb.get()) { - System.out.println("Sending Write Attribute Request"); - zigConnection.sendWriteAttributesCommand(0x0002, 0x0500, 0x0104, 0x01); - sleep(0); - } - - //made by changwoo - System.out.println("Sending Enrollment Reponse"); - zigConnection.sendEnrollmentResponse(0x0003, 0x0500, 0x0104, 0x01); - sleep(0); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - //made by changwoo - private void sleep(int multipleTime){ - if(multipleTime<=0){ - multipleTime=1; - } - try{ - Thread.sleep(TIMEOUT_FOR_RESEND_MSEC*multipleTime); - } catch(Exception e){ - e.printStackTrace(); - } - } - - public void close() { - - if (didAlreadyClose.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyInit.set(false); - - - try { - zigConnection.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - public void Finalize() { - if (!didClose) { - close(); - } - } - - public int getValue() { - - int tmp = 0; - try { - gettingLatestDataMutex.acquire(); - tmp = detectedValue; - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - return tmp; - } - - // MotionSensor: - // - 24 = no motion = false - // - 26 = motion = true - // After getting 26, if there is no motion for ~12 seconds then we get back 24 - public boolean isActiveValue() { - - int tmp = getValue(); - if (tmp == 26) - detectStatus = true; - else // Getting 24 here - detectStatus = false; - - return detectStatus; - } - - public long getTimestampOfLastReading() { - - Date tmp = null; - try { - gettingLatestDataMutex.acquire(); - tmp = (Date)timestampOfLastDetecting.clone(); - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - long retLong = tmp.getTime(); - - return retLong; - } - - public void newMessageAvailable(IoTZigbeeMessage _zm) { - - //made by changwoo - if(_zm instanceof IoTZigbeeMessageZclZoneStatusChangeNotification){ - IoTZigbeeMessageZclZoneStatusChangeNotification message = (IoTZigbeeMessageZclZoneStatusChangeNotification)_zm; - if(message.getSuccessOrFail()){ - //do something! - - try { - gettingLatestDataMutex.acquire(); - detectedValue = message.getStatus(); - timestampOfLastDetecting = new Date(); - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - try { - for (SmartthingsSensorCallback cb : callbackList) { - cb.newReadingAvailable(this.getValue(), this.isActiveValue()); - } - } catch (Exception e) { - e.printStackTrace(); - } - }//if - - //made by changwoo - } else if (_zm instanceof IoTZigbeeMessageZclWriteAttributesResponse) { - IoTZigbeeMessageZclWriteAttributesResponse message = (IoTZigbeeMessageZclWriteAttributesResponse)_zm; - if (message.getSuccessOrFail()) { - didWriteAttrb.set(true); - } - } - } - - public void registerCallback(SmartthingsSensorCallback _callbackTo) { - callbackList.add(_callbackTo); - } -} diff --git a/benchmarks/other/ZigbeeTest/MultipurposeSensor.java b/benchmarks/other/ZigbeeTest/MultipurposeSensor.java deleted file mode 100644 index a21155f..0000000 --- a/benchmarks/other/ZigbeeTest/MultipurposeSensor.java +++ /dev/null @@ -1,221 +0,0 @@ -// Standard Java Packages -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Semaphore; - -// Checker annotations -//import iotchecker.qual.*; -//import iotcode.annotation.*; - -// IoT Packages -import iotruntime.slave.*; -import iotcode.interfaces.*; -import iotruntime.zigbee.*; - -/** Class Smartthings sensor driver for Smartthings sensor devices. - * - * @author Changwoo Lee, Rahmadi Trimananda - * @version 1.0 - * @since 2016-12-01 - */ -public class MultipurposeSensor implements IoTZigbeeCallback, SmartthingsSensor { - - private final int TIMEOUT_FOR_RESEND_MSEC = 900; - - private IoTZigbee zigConnection = null; - private boolean didClose; // make sure that the clean up was done correctly - private boolean detectStatus = false; - - private int detectedValue = 0; - private Date timestampOfLastDetecting = null; - - private AtomicBoolean didAlreadyClose = new AtomicBoolean(true); - private AtomicBoolean didAlreadyInit = new AtomicBoolean(false); - private AtomicBoolean didWriteAttrb = new AtomicBoolean(false); - private AtomicBoolean didMatchDscr = new AtomicBoolean(false); - static Semaphore gettingLatestDataMutex = new Semaphore(1); - - private List < SmartthingsSensorCallback > callbackList = new CopyOnWriteArrayList < SmartthingsSensorCallback > (); - - @config private IoTSet devUdpAddress; - @config private IoTSet devZigbeeAddress; - - public MultipurposeSensor(IoTSet dSet, IoTSet zigSet) { - devUdpAddress = dSet; - devZigbeeAddress = zigSet; - } - - public void init() { - - if (didAlreadyInit.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyClose.set(false); - - try { - Iterator itrUdp = devUdpAddress.iterator(); - Iterator itrZig = devZigbeeAddress.iterator(); - - zigConnection = new IoTZigbee((IoTDeviceAddress)itrUdp.next(), (IoTZigbeeAddress)itrZig.next()); - - // DEBUG - System.out.println("DEBUG: Allocate iterators to print out addresses!"); - Iterator itrDebugUdp = devUdpAddress.iterator(); - IoTDeviceAddress iotaddDebug = (IoTDeviceAddress)itrDebugUdp.next(); - System.out.println("IP address: " + iotaddDebug.getCompleteAddress()); - System.out.println("Source port: " + iotaddDebug.getSourcePortNumber()); - System.out.println("Destination port: " + iotaddDebug.getDestinationPortNumber()); - - Iterator itrDebugZig = devZigbeeAddress.iterator(); - IoTZigbeeAddress iotzbaddDebug = (IoTZigbeeAddress)itrDebugZig.next(); - System.out.println("Zigbee address: " + iotzbaddDebug.getAddress()); - - zigConnection.registerCallback(this); - System.out.println("Register callback!"); - zigConnection.init(); - System.out.println("Initialized!"); - - //made by changwoo - sleep(10); - System.out.println("Sending Management Permit Joining Request"); - for(int z=0; z<3; z++){ - zigConnection.sendManagementPermitJoiningRequest(0x0001, 0x0036, 0x00); - sleep(0); - } - - //made by changwoo - while (!didWriteAttrb.get()) { - System.out.println("Sending Write Attribute Request"); - zigConnection.sendWriteAttributesCommand(0x0002, 0x0500, 0x0104, 0x01); - sleep(0); - } - - //made by changwoo - System.out.println("Sending Enrollment Reponse"); - zigConnection.sendEnrollmentResponse(0x0003, 0x0500, 0x0104, 0x01); - sleep(0); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - //made by changwoo - private void sleep(int multipleTime){ - if(multipleTime<=0){ - multipleTime=1; - } - try{ - Thread.sleep(TIMEOUT_FOR_RESEND_MSEC*multipleTime); - } catch(Exception e){ - e.printStackTrace(); - } - } - - public void close() { - - if (didAlreadyClose.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyInit.set(false); - - - try { - zigConnection.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void Finalize() { - if (!didClose) { - close(); - } - } - - public int getValue() { - - int tmp = 0; - try { - gettingLatestDataMutex.acquire(); - tmp = detectedValue; - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - return tmp; - } - - // MultipurposeSensor: - // - 24 = close = false - // - 25 = open = true - public boolean isActiveValue() { - - int tmp = getValue(); - if (tmp == 25) - detectStatus = true; - else // Getting 24 here - detectStatus = false; - - return detectStatus; - } - - public long getTimestampOfLastReading() { - - Date tmp = null; - try { - gettingLatestDataMutex.acquire(); - tmp = (Date)timestampOfLastDetecting.clone(); - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - long retLong = tmp.getTime(); - - return retLong; - } - - public void newMessageAvailable(IoTZigbeeMessage _zm) { - - //made by changwoo - if(_zm instanceof IoTZigbeeMessageZclZoneStatusChangeNotification){ - IoTZigbeeMessageZclZoneStatusChangeNotification message = (IoTZigbeeMessageZclZoneStatusChangeNotification)_zm; - if(message.getSuccessOrFail()){ - //do something! - try { - gettingLatestDataMutex.acquire(); - detectedValue = message.getStatus(); - timestampOfLastDetecting = new Date(); - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - try { - for (SmartthingsSensorCallback cb : callbackList) { - cb.newReadingAvailable(this.getValue(), this.isActiveValue()); - } - } catch (Exception e) { - e.printStackTrace(); - } - }//if - - //made by changwoo - }//if - else if (_zm instanceof IoTZigbeeMessageZclWriteAttributesResponse) { - IoTZigbeeMessageZclWriteAttributesResponse message = (IoTZigbeeMessageZclWriteAttributesResponse)_zm; - if (message.getSuccessOrFail()) { - didWriteAttrb.set(true); - }//if - }//else if - } - - public void registerCallback(SmartthingsSensorCallback _callbackTo) { - callbackList.add(_callbackTo); - } -} diff --git a/benchmarks/other/ZigbeeTest/SmartthingsSensor.java b/benchmarks/other/ZigbeeTest/SmartthingsSensor.java deleted file mode 100644 index d739f19..0000000 --- a/benchmarks/other/ZigbeeTest/SmartthingsSensor.java +++ /dev/null @@ -1,71 +0,0 @@ -// Standard Java Packages -import java.util.Date; - -//RMI packages -import java.rmi.Remote; -import java.rmi.RemoteException; - -// Checker annotations -//import iotchecker.qual.*; - - -/** Class Smartthings sensor interface for Smartthings sensor devices. - * - * @author Rahmadi Trimananda , Changwoo Lee - * @version 1.0 - * @since 2016-12-21 - */ -public interface SmartthingsSensor extends Remote { - - /** Method to get the latests moisture reading from the sensor - * - * @return [float] Moisture as a percentage. - */ - public int getValue() throws RemoteException; - - - /** Method to probe the sensor for active value - * - * @return [boolean] True means sensor is actively detecting something. - */ - public boolean isActiveValue() throws RemoteException; - - - /** Method to get the latests moisture reading timestamp from the sensor - * - * @return [Date] timestamp of latest moisture reading, null if no reading occurred yet. - */ - public long getTimestampOfLastReading() throws RemoteException; - - - /** Method to initialize the moisture sensor. - * - * @param None. - * - * @return [void] None. - */ - public void init() throws RemoteException; - - - /** Register an object to retrieve callbacks when new sensor reading is available - * - * @param _callbackTo [MoistureSensorCallback]. - * - * @return [void] None. - */ - public void registerCallback(SmartthingsSensorCallback _callbackTo) throws RemoteException; -} - - - - - - - - - - - - - - diff --git a/benchmarks/other/ZigbeeTest/SmartthingsSensorCallback.java b/benchmarks/other/ZigbeeTest/SmartthingsSensorCallback.java deleted file mode 100644 index 2367da1..0000000 --- a/benchmarks/other/ZigbeeTest/SmartthingsSensorCallback.java +++ /dev/null @@ -1,16 +0,0 @@ -// Checker annotations -//import iotchecker.qual.*; - - -/** Smartthings Sensor Callback for when a camera changes state (new frame available). - * - * @author Rahmadi Trimananda , Changwoo Lee - * @version 1.0 - * @since 2016-12-21 - */ - -public interface SmartthingsSensorCallback { - - //public void newReadingAvailable(@NonLocalRemote SmartthingsSensor _sensor) throws RemoteException; - public void newReadingAvailable(int _value, boolean _activeValue); -} diff --git a/benchmarks/other/ZigbeeTest/SpruceSensor.java b/benchmarks/other/ZigbeeTest/SpruceSensor.java deleted file mode 100644 index 7dccc1f..0000000 --- a/benchmarks/other/ZigbeeTest/SpruceSensor.java +++ /dev/null @@ -1,217 +0,0 @@ -// Standard Java Packages -import java.util.Iterator; -import java.util.List; -import java.util.ArrayList; -import java.util.Date; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Semaphore; - - -// Checker annotations -//import iotchecker.qual.*; - -// IoT Packages -import iotruntime.slave.*; -//import iotcode.interfaces.MoistureSensor; -//import iotcode.interfaces.MoistureSensorSmartCallback; -import iotruntime.zigbee.*; -//import iotcode.annotation.*; - -public class SpruceSensor implements IoTZigbeeCallback, MoistureSensor { - - private final int TIMEOUT_FOR_RESEND_MSEC = 1000; - - private IoTZigbee zigConnection = null; - private boolean didClose; // make sure that the clean up was done correctly - - private float humidity = 0; - private Date timestampOfLastHumidity = null; - - private AtomicBoolean didBind = new AtomicBoolean(false); - private AtomicBoolean didConfigureReporting = new AtomicBoolean(false); - private AtomicBoolean didAlreadyInit = new AtomicBoolean(false); - private AtomicBoolean didAlreadyClose = new AtomicBoolean(true); - static Semaphore gettingLatestDataMutex = new Semaphore(1); - - private List < MoistureSensorSmartCallback > callbackList = new CopyOnWriteArrayList < MoistureSensorSmartCallback > (); - - private int sensorId = 0; - - @config private IoTSet devUdpAddress; - @config private IoTSet devZigbeeAddress; - - public SpruceSensor(IoTSet _devUdpAddress, IoTSet _devZigbeeAddress) { - devUdpAddress = _devUdpAddress; - devZigbeeAddress = _devZigbeeAddress; - } - - public void init() { - - if (didAlreadyInit.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyClose.set(false); - - try { - Iterator itrUdp = devUdpAddress.iterator(); - Iterator itrZig = devZigbeeAddress.iterator(); - - zigConnection = new IoTZigbee((IoTDeviceAddress)itrUdp.next(), (IoTZigbeeAddress)itrZig.next()); - - // DEBUG - System.out.println("DEBUG: Allocate iterators to print out addresses!"); - Iterator itrDebugUdp = devUdpAddress.iterator(); - IoTDeviceAddress iotaddDebug = (IoTDeviceAddress)itrDebugUdp.next(); - System.out.println("IP address: " + iotaddDebug.getCompleteAddress()); - System.out.println("Source port: " + iotaddDebug.getSourcePortNumber()); - System.out.println("Destination port: " + iotaddDebug.getDestinationPortNumber()); - - Iterator itrDebugZig = devZigbeeAddress.iterator(); - IoTZigbeeAddress iotzbaddDebug = (IoTZigbeeAddress)itrDebugZig.next(); - System.out.println("Zigbee address: " + iotzbaddDebug.getAddress()); - - zigConnection.registerCallback(this); - System.out.println("Register callback!"); - zigConnection.init(); - System.out.println("Initialized!"); - - while (!didBind.get()) { - zigConnection.sendBindRequest(0x0001, 0x0405, 0x01); - System.out.println("Sending bind request!"); - try { - Thread.sleep(TIMEOUT_FOR_RESEND_MSEC); - } catch (Exception e) { - e.printStackTrace(); - } - } - - while (!didConfigureReporting.get()) { - zigConnection.sendConfigureReportingCommand(0x0001, 0x0405, 0x0104, 0x01, 0x0000, 0x21, 0x0001, 0x0001, null); - try { - Thread.sleep(TIMEOUT_FOR_RESEND_MSEC); - } catch (Exception e) { - e.printStackTrace(); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void close() { - - if (didAlreadyClose.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyInit.set(false); - - - try { - zigConnection.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void Finalize() { - if (!didClose) { - close(); - } - } - - public void setId(int id) { - - sensorId = id; - - } - - public int getId() { - - return sensorId; - - } - - public float getMoisture() { - - float tmp = 0; - try { - gettingLatestDataMutex.acquire(); - tmp = humidity; - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - return tmp; - } - - public long getTimestampOfLastReading() { - - Date tmp = null; - try { - gettingLatestDataMutex.acquire(); - tmp = (Date)timestampOfLastHumidity.clone(); - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - long retLong = tmp.getTime(); - - return retLong; - } - - public void newMessageAvailable(IoTZigbeeMessage _zm) { - - if (_zm instanceof IoTZigbeeMessageZdoBindResponse) { - IoTZigbeeMessageZdoBindResponse message = (IoTZigbeeMessageZdoBindResponse)_zm; - if (message.getSucceeded()) { - didBind.set(true); - } - - } else if (_zm instanceof IoTZigbeeMessageZclConfigureReportingResponse) { - IoTZigbeeMessageZclConfigureReportingResponse message = (IoTZigbeeMessageZclConfigureReportingResponse)_zm; - if (message.getAllSuccess()) { - didConfigureReporting.set(true); - } - - } else if (_zm instanceof IoTZigbeeMessageZclReportAttributes) { - IoTZigbeeMessageZclReportAttributes message = (IoTZigbeeMessageZclReportAttributes)_zm; - List attrList = message.getAttributes(); - - if (attrList.size() == 1) { - if (attrList.get(0).getAttributeId() == 0) { - byte[] data = attrList.get(0).getData(); - - int value = (data[0] * 256) + data[1]; - - try { - gettingLatestDataMutex.acquire(); - humidity = (float)value / (float)100.0; - timestampOfLastHumidity = new Date(); - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - try { - for (MoistureSensorSmartCallback cb : callbackList) { - cb.newReadingAvailable(this.getId(), this.getMoisture(), this.getTimestampOfLastReading()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - } - } - - public void registerCallback(MoistureSensorSmartCallback _callbackTo) { - callbackList.add(_callbackTo); - } -} diff --git a/benchmarks/other/ZigbeeTest/WaterLeakSensor.java b/benchmarks/other/ZigbeeTest/WaterLeakSensor.java deleted file mode 100644 index 75923a4..0000000 --- a/benchmarks/other/ZigbeeTest/WaterLeakSensor.java +++ /dev/null @@ -1,222 +0,0 @@ -// Standard Java Packages -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Semaphore; - -// Checker annotations -//import iotchecker.qual.*; -//import iotcode.annotation.*; - -// IoT Packages -import iotruntime.slave.*; -import iotcode.interfaces.*; -import iotruntime.zigbee.*; - -/** Class Smartthings sensor driver for Smartthings sensor devices. - * - * @author Changwoo Lee, Rahmadi Trimananda - * @version 1.0 - * @since 2016-12-01 - */ -public class WaterLeakSensor implements IoTZigbeeCallback, SmartthingsSensor { - - private final int TIMEOUT_FOR_RESEND_MSEC = 900; - - private IoTZigbee zigConnection = null; - private boolean didClose; // make sure that the clean up was done correctly - private boolean detectStatus = false; - - private int detectedValue = 0; - private Date timestampOfLastDetecting = null; - - private AtomicBoolean didAlreadyInit = new AtomicBoolean(false); - private AtomicBoolean didAlreadyClose = new AtomicBoolean(true); - private AtomicBoolean didWriteAttrb = new AtomicBoolean(false); - private AtomicBoolean didMatchDscr = new AtomicBoolean(false); - static Semaphore gettingLatestDataMutex = new Semaphore(1); - - private List < SmartthingsSensorCallback > callbackList = new CopyOnWriteArrayList < SmartthingsSensorCallback > (); - - @config private IoTSet devUdpAddress; - @config private IoTSet devZigbeeAddress; - - public WaterLeakSensor(IoTSet dSet, IoTSet zigSet) { - devUdpAddress = dSet; - devZigbeeAddress = zigSet; - } - - public void init() { - - if (didAlreadyInit.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyClose.set(false); - - try { - Iterator itrUdp = devUdpAddress.iterator(); - Iterator itrZig = devZigbeeAddress.iterator(); - - zigConnection = new IoTZigbee((IoTDeviceAddress)itrUdp.next(), (IoTZigbeeAddress)itrZig.next()); - - // DEBUG - System.out.println("DEBUG: Allocate iterators to print out addresses!"); - Iterator itrDebugUdp = devUdpAddress.iterator(); - IoTDeviceAddress iotaddDebug = (IoTDeviceAddress)itrDebugUdp.next(); - System.out.println("IP address: " + iotaddDebug.getCompleteAddress()); - System.out.println("Source port: " + iotaddDebug.getSourcePortNumber()); - System.out.println("Destination port: " + iotaddDebug.getDestinationPortNumber()); - - Iterator itrDebugZig = devZigbeeAddress.iterator(); - IoTZigbeeAddress iotzbaddDebug = (IoTZigbeeAddress)itrDebugZig.next(); - System.out.println("Zigbee address: " + iotzbaddDebug.getAddress()); - - zigConnection.registerCallback(this); - System.out.println("Register callback!"); - zigConnection.init(); - System.out.println("Initialized!"); - - //made by changwoo - sleep(10); - System.out.println("Sending Management Permit Joining Request"); - for(int z=0; z<3; z++){ - zigConnection.sendManagementPermitJoiningRequest(0x0001, 0x0036, 0x00); - sleep(0); - } - - //made by changwoo - while (!didWriteAttrb.get()) { - System.out.println("Sending Write Attribute Request"); - zigConnection.sendWriteAttributesCommand(0x0002, 0x0500, 0x0104, 0x01); - sleep(0); - } - - //made by changwoo - System.out.println("Sending Enrollment Reponse"); - zigConnection.sendEnrollmentResponse(0x0003, 0x0500, 0x0104, 0x01); - sleep(0); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - //made by changwoo - private void sleep(int multipleTime){ - if(multipleTime<=0){ - multipleTime=1; - } - try{ - Thread.sleep(TIMEOUT_FOR_RESEND_MSEC*multipleTime); - } catch(Exception e){ - e.printStackTrace(); - } - } - - public void close() { - - if (didAlreadyClose.compareAndSet(false, true) == false) { - return; // already init - } - - didAlreadyInit.set(false); - - - try { - zigConnection.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void Finalize() { - if (!didClose) { - close(); - } - } - - public int getValue() { - - int tmp = 0; - try { - gettingLatestDataMutex.acquire(); - tmp = detectedValue; - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - - return tmp; - } - - // WaterLeakSensor: - // - 24 = no leak = false - // - 25 = leak = true - public boolean isActiveValue() { - - int tmp = getValue(); - if (tmp == 25) - detectStatus = true; - else // Getting 24 here - detectStatus = false; - - return detectStatus; - } - - public long getTimestampOfLastReading() { - - Date tmp = null; - try { - gettingLatestDataMutex.acquire(); - tmp = (Date)timestampOfLastDetecting.clone(); - - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - long retLong = tmp.getTime(); - - return retLong; - } - - public void newMessageAvailable(IoTZigbeeMessage _zm) { - - //made by changwoo - if(_zm instanceof IoTZigbeeMessageZclZoneStatusChangeNotification){ - IoTZigbeeMessageZclZoneStatusChangeNotification message = (IoTZigbeeMessageZclZoneStatusChangeNotification)_zm; - if(message.getSuccessOrFail()){ - //do something! - - try { - gettingLatestDataMutex.acquire(); - detectedValue = message.getStatus(); - timestampOfLastDetecting = new Date(); - } catch (Exception e) { - e.printStackTrace(); - } - gettingLatestDataMutex.release(); - try { - for (SmartthingsSensorCallback cb : callbackList) { - cb.newReadingAvailable(this.getValue(), this.isActiveValue()); - } - } catch (Exception e) { - e.printStackTrace(); - } - }//if - - //made by changwoo - }//if - else if (_zm instanceof IoTZigbeeMessageZclWriteAttributesResponse) { - IoTZigbeeMessageZclWriteAttributesResponse message = (IoTZigbeeMessageZclWriteAttributesResponse)_zm; - if (message.getSuccessOrFail()) { - didWriteAttrb.set(true); - }//if - }//else if - } - - public void registerCallback(SmartthingsSensorCallback _callbackTo) { - callbackList.add(_callbackTo); - } -} diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTest.java b/benchmarks/other/ZigbeeTest/ZigbeeTest.java deleted file mode 100644 index 9fe8cbe..0000000 --- a/benchmarks/other/ZigbeeTest/ZigbeeTest.java +++ /dev/null @@ -1,78 +0,0 @@ -import java.util.Map; -import java.net.*; -import java.io.*; -import java.util.*; - -import iotruntime.*; -import iotruntime.zigbee.*; - -//import iotcode.interfaces.*; -import java.rmi.RemoteException; - -public class ZigbeeTest implements MoistureSensorSmartCallback { - - public final int SOCKET_SEND_BUFFER_SIZE = 1024; - public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; - - - public ZigbeeTest() { - } - - - public void newReadingAvailable(int sensorId, float moisture, long timeStampOfLastReading) { - System.out.println("New Message!!!!"); - System.out.println(moisture); - System.out.println("Reading time: " + timeStampOfLastReading); - } - - - - - - - public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{ - - String message = "type: policy_set\n"; - message += "ip_address: " + "192.168.2.108\n"; // local ip address - //message += "port: " + "5959\n"; // port number - message += "port: " + "5557\n"; // port number - message += "device_address_long: " + "000d6f0003ebf2ee" + "\n"; - //DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("128.195.204.110"), 5005); // address and port of the gateway - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("192.168.2.192"), 5005); // address and port of the gateway - - DatagramSocket socket = new DatagramSocket(); - socket.setSendBufferSize(4096); - socket.setReceiveBufferSize(4096); - - socket.send(sendPacket); - - - - - //IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("128.195.204.110", 5557, 5005,false,false); - IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.2.192", 5557, 5005,false,false); - IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress("000d6f0003ebf2ee"); - - Set zigSet = new HashSet(); - zigSet.add(zigAddrLong); - IoTSet zigIotSet = new IoTSet(zigSet); - - Set devSet = new HashSet(); - devSet.add(zigUdpAddr); - IoTSet devIotSet = new IoTSet(devSet); - SpruceSensor sen = new SpruceSensor(devIotSet, zigIotSet); - - System.out.println("About to init"); - sen.init(); - System.out.println("Passed init!"); - ZigbeeTest zTest = new ZigbeeTest(); - System.out.println("ZigbeeTest created!"); - sen.registerCallback(zTest); - - - System.out.println("Loop Begin"); - while (true) { - - } - } -} diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTestDoorlock.class b/benchmarks/other/ZigbeeTest/ZigbeeTestDoorlock.class new file mode 100644 index 0000000000000000000000000000000000000000..49e2c3d41ee8cb49360e448b78fae645f815ba59 GIT binary patch literal 2887 zcmaJ@*;^ae75@zq%rM9{5;(H3aplIb1vVh?QX^6)l8}QM0WQKglG~^w=^_sn8buo6 zkhD#@C0&vs+H}d%R!Ym)JoTv$eeXZe*S__sU)tZ51PGgSzHiRG_uRAH-#O>b z{O!FzzYE|z-qA6IbT8bvA<4&j@o_w^A*16HFf?Q}K4hGc9*??wwQ6^PpKW?aK-rfsqvj&Zw0a3JxXAl31v%XGLY%$QH>ND2dxk z!pPHMc*8J@EpB%po|b9{lD3h%HE)#L($00mEGf7zaO2)^M^;q4tl||Wi>V>_#9hT5 zqD+99O$B=F$($(LCb3fSH5Ff1@eLK<pyFFDd>h~4p%%n#|GcPHje7|uKX>65cvT|#+J5RuiH$9{f9b-nBzawuU*k6}{1(4+;SGd|YTR0$ZH5?b9Y`v? z+2Xg3-sY2achpjpiE%d(ui0jCV$P`EOv;$=xbPOe2P$4j=T zRBB~gU` zDiXTGf&Dt1*)hsxQDP&F?I&=LPP>!n@K_)|@_)89+uBBRFmSIR4QK^nM>cIyWuI^Y5VH%;G^$fq$4|c3ia{b|swU_J5 z9r_Q!L0x_aNF(%cjy@EQ1EUQnqi!cJhOXA&c#CWWQPP7{0z-2`MISVBXAx@~c!PUR z?q=SG)6-o?&(X`nuX7#ZE1xdDKE5aUPDmM*GOuAuPPOLrw4C-fr^h(mf}U!i&*Q4& zz;GQ0>o~+c8BA9*m~n;x^fL@Me{?)FJczUWotc1_XdR*BA)f3g102TV@Z$=lb#(s+ zCly`SkDwQiV2-wUdgU)Xkc;C%Pk*BA_YB>7JS6nHhc~bfZ*YfqI7P+#;6yPDkX-NKoauh*wG za5kiG!A(PBp+2AP>#Jj20zW};eR>^1xtMHbfq=EKUL%$=bq+j0bWib*?lc}k0FUvn zFNaaAk@E!6-@q82#yFlq5O*-i&-*#N$~u0NmAA#L{FOEQch>Dcn4N#JUjM}!{WmSW zhldphB1#`KEAuo4<-c6GRK!($M8%^j5-R3ZET~viadn%1RK*g-lYDhn-!iUY1=m@T KkCD@b)c*itcekGa literal 0 HcmV?d00001 diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTest_doorlock.java b/benchmarks/other/ZigbeeTest/ZigbeeTestDoorlock.java similarity index 60% rename from benchmarks/other/ZigbeeTest/ZigbeeTest_doorlock.java rename to benchmarks/other/ZigbeeTest/ZigbeeTestDoorlock.java index 5582191..66811ae 100644 --- a/benchmarks/other/ZigbeeTest/ZigbeeTest_doorlock.java +++ b/benchmarks/other/ZigbeeTest/ZigbeeTestDoorlock.java @@ -3,24 +3,17 @@ import java.net.*; import java.io.*; import java.util.*; -import iotruntime.*; -import iotruntime.zigbee.*; - -import iotcode.interfaces.*; -import java.rmi.RemoteException; - -//public class ZigbeeTest_doorlock implements IoTZigbeeCallback { -public class ZigbeeTest_doorlock implements SmartthingsSensorCallback { +public class ZigbeeTestDoorlock implements SmartthingsSensorCallback { public final int SOCKET_SEND_BUFFER_SIZE = 1024; public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; private static final String MY_IP_ADDRESS = "192.168.1.198"; - public static final String DEVIDE_MAC_ADDRESS = "002446fffd00b0ba"; //doorlock sensor + private static final String DEVICE_MAC_ADDRESS = "002446fffd00b0ba"; //doorlock sensor + private static final String GATEWAY = "192.168.1.192"; + private static final int LOCAL_COMM_SOCKET = 5960; - //public void newReadingAvailable(SmartthingsSensor _sensor) { public void newReadingAvailable(int _value, boolean _activeValue) { System.out.println("New Message!!!!"); - //int status = ((DoorlockSensor)_sensor).getStatus(); int status = _value; switch (status) { case 0: @@ -38,22 +31,22 @@ public class ZigbeeTest_doorlock implements SmartthingsSensorCallback { } } - public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{ + public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException { String message = "type: policy_set\n"; message += "ip_address: " + MY_IP_ADDRESS + "\n"; // local ip address - message += "port: " + "5959\n"; // port number - message += "device_address_long: " + DEVIDE_MAC_ADDRESS + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("192.168.1.192"), 5005); // address and port of the gateway which means Raspberry PI's IP address - DatagramSocket socket = new DatagramSocket(12345/*test number*/); + message += "port: " + LOCAL_COMM_SOCKET + "\n"; // port number + message += "device_address_long: " + DEVICE_MAC_ADDRESS + "\n"; + DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(GATEWAY), 5005); // address and port of the gateway which means Raspberry PI's IP address + DatagramSocket socket = new DatagramSocket(12345); socket.setSendBufferSize(4096); socket.setReceiveBufferSize(4096); socket.send(sendPacket); socket.setReuseAddress(true); socket.close(); - IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.1.192", 5959, 5005,false,false); - IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVIDE_MAC_ADDRESS); + IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false); + IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS); Set zigSet = new HashSet(); zigSet.add(zigAddrLong); @@ -64,16 +57,12 @@ public class ZigbeeTest_doorlock implements SmartthingsSensorCallback { IoTSet devIotSet = new IoTSet(devSet); DoorlockSensor sen = new DoorlockSensor(devIotSet, zigIotSet); - ZigbeeTest_doorlock zTest = new ZigbeeTest_doorlock(); + ZigbeeTestDoorlock zTest = new ZigbeeTestDoorlock(); sen.registerCallback(zTest); System.out.println("About to init"); sen.init(); - // ZigbeeTest_doorlock zTest = new ZigbeeTest_doorlock(); - // sen.registerCallback(zTest); - - System.out.println("Loop Begin"); while (true) { diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.class b/benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.class new file mode 100644 index 0000000000000000000000000000000000000000..3ea6145c9be62bbb07be7f1d368f0c8f95a4e04e GIT binary patch literal 2794 zcmaJ@S$A7k75;84>s(*o)Rr74QAW8gRB;5h@Q@w~u?b$rCY06r@4f`Kzg zcjIIDxWFe2JcLgQe9FKeUexiDIzO%BGX@h*E9SF0J}2;bfiGw{lA4P?8C%SxVzbkk zsp~T{v4u=3z8uq_#Wfs^I;E;>mE0w(P?H^i2O5rTx-7(^vG`JKx7WdBIuoDIM5d<~ zVyTn{f8v(4W{noCQhqe$R_s!KQpd}bPsf(x(O4!KiS8JSCnAfn8{tHFE4F4^v58ahIQOBy^;Cnq)ZBfV`F2vi>suM%9Yh~Qqr)Mc1gOU z)0S)HD^_uyP)nBxoA?2KNbuWlIw$ZW6F}m6b}Z?8;o5L0{9rc1GiKZPK<{ zQ|nb%7P;kwOhbQbNohaN7sO@8(kf1}wyiL2Vhy6Kj0yy=KeYdLdqOj6$-P#&EK4~J z!~5CYpcrRq|fA8$Arx;YhZ<+xWFZ$5yb=HcV=bBuCRwbfNwN!icwo}e}@9PUCTAMeybvCP0E5<3WaEUlbm7Vnnh7#|xJ`Bk(Y7f8h8qUEB zpL&(~{|o&1AHYTOe4yL-W4MfoZ9a@+m~7+kCx4}l?-pq!He5iFar` z`-U3OhI}4A2M1b5$6FL@m?HJ_8w~W4>gYxnc^@@VOm7BBQqxI`!MEY@ch=$Md8Q7* zV*`4+fiAyMNB2M-W*rBq-y6E0fe#adBM9*aM;Bt4VP4En`wIk2o`?PSB{pL{%uxPb z62{sk^X((^Z_E19bUdW~-tqVU0f&8kFE?-`xq+i;-`GS0f!SeSFX}kfI*t!NQpbs5 zPaP+R>o~Q6(`kRdum3LHIyxE%hFRJ`+JAoo4}?26aE4Vr81@FdfzChT>;c@^z(eVP zw}DVtY-#m?9`Lkjb*1gvz+gJi6%Y*!g$)HDQ}hOi*CUGI-QErKF#1TiJ75G@^r(`L zQT`?&S2LnoRKju6lkDy(qIen)Bgiff;3+(SEPtup!h?7QXR*c~YR?np7chiZY4tjW z@diftK^escXYkLQ!M||=|IV5D2dD3!oREKU;{J^Z&4aMkjVoFoC+Z2_HVo~*WK4mp q0&#(B0#6Dg1d;-?0&`n*Uf_K+U*Mm?Nl9T5*RjOexk1SRJoP^mHmCgn literal 0 HcmV?d00001 diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.java b/benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.java new file mode 100644 index 0000000..6c07a7e --- /dev/null +++ b/benchmarks/other/ZigbeeTest/ZigbeeTestMoisture.java @@ -0,0 +1,65 @@ +import java.util.Map; +import java.net.*; +import java.io.*; +import java.util.*; + +public class ZigbeeTestMoisture implements MoistureSensorSmartCallback { + + public final int SOCKET_SEND_BUFFER_SIZE = 1024; + public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; + private static final String MY_IP_ADDRESS = "192.168.1.198"; + private static final String DEVICE_MAC_ADDRESS = "000d6f0003ebf2ee"; //doorlock sensor + private static final String GATEWAY = "192.168.1.192"; + private static final int LOCAL_COMM_SOCKET = 5557; + + + public ZigbeeTestMoisture() { + } + + + public void newReadingAvailable(int sensorId, float moisture, long timeStampOfLastReading) { + System.out.println("New Message!!!!"); + System.out.println(moisture); + System.out.println("Reading time: " + timeStampOfLastReading); + } + + + public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException { + + String message = "type: policy_set\n"; + message += "ip_address: " + MY_IP_ADDRESS + "\n"; // local ip address + message += "port: " + LOCAL_COMM_SOCKET + "\n"; // port number + message += "device_address_long: " + DEVICE_MAC_ADDRESS + "\n"; + DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(GATEWAY), 5005); // address and port of the gateway + + DatagramSocket socket = new DatagramSocket(12345); + socket.setSendBufferSize(4096); + socket.setReceiveBufferSize(4096); + socket.send(sendPacket); + socket.setReuseAddress(true); + socket.close(); + + IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false); + IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS); + + Set zigSet = new HashSet(); + zigSet.add(zigAddrLong); + IoTSet zigIotSet = new IoTSet(zigSet); + + Set devSet = new HashSet(); + devSet.add(zigUdpAddr); + IoTSet devIotSet = new IoTSet(devSet); + SpruceSensor sen = new SpruceSensor(devIotSet, zigIotSet); + + System.out.println("About to init"); + sen.init(); + System.out.println("Passed init!"); + ZigbeeTestMoisture zTest = new ZigbeeTestMoisture(); + sen.registerCallback(zTest); + + System.out.println("Loop Begin"); + while (true) { + + } + } +} diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTestMotion.class b/benchmarks/other/ZigbeeTest/ZigbeeTestMotion.class new file mode 100644 index 0000000000000000000000000000000000000000..335ce8d7baffc10779982fd0453e5b3f4686fed7 GIT binary patch literal 2804 zcmaJ@*?${X75*lceaGWTV#$sjB~Gd|G?krt%SJ4hrn00oqLLjf$Eh4ZjHDYyiKG$I z$f;YPtSw77O3Pk$T6Smw3Gk0T@x%k~`~y7l!Ye=EyCW~M<6{4OuJ75;ch0?Y|N5Ul zy#wGJS_Y<(?nOUV6uHrh58^{QK5QU^j|f->1kyUPYRxHNkyoTY_Lgew-QYICfk7nks zUA`P!%%tKgF%4Q=!~Td}sXJE1S++_I*#&r@;mC%`Vk{DiFUNLT?N6pN@vE6|G`bi| zr8M{wx2;ucvSd{XlPRZGtQ2N-yg+_5wj7VdGRbgcTUk67UW#20r!{yJ3z2Xl6In^B1@~m6xl62EEUCyM-3k)Pq` zCVqimn)nqSWp#0TDe9&eZWp8se%3buFPr!c z-r{J|JsC>#Z4G9-$thW>+cm}eEvpJ=?S>O@?0_0#6Teff|2>*)Pr|mVfjL=FW7)sm z;DzjMnR7JwQ)R2>IJY>?^|s51RVrnP+Agdva`g8Y>K#to=a7cm#V~IT$K1Wb^;+dl z#lBm)V%MFm+17A)OWwx2Lv(yQ<#@%BwOXU<$b5&wfU8inC*unp+>T09YjsDKd9H~N z4@>)8QvWLN42Ky@t31ovHr;fvHHfNGDiOLv!MzW3k5#S8N?ybGUJCcvY@8?t90|rp z|BqOA>`gQWgZC=B4p#2vZ~NB^(wSRxWSw_eaP-EUhQTeA<7~y&ME1Ih^H!Nx$=JIW zp}N;$#{`ZAZ_LHpCF~Z)-Mf$#^2+n_2H<4n=NdO}%37-U6ypq%wy72~riS_}U-CW)3)Jfy?*LbuzV72XIb3B-M*F!~zIKj{5G(UG|&;zf!p!xrK zJ_7dP0{6VDJN8F#5i?u+5RPEBV}FwShdcH|+`q5G{t~37A|D_zosEf}Ex+pO=Kb zcJO?A@CLScgJ~KbQh)FGhW>zI@4yQ!98RvopY~48v~Xm8+}n>Pj<%PP@rRl?HtuQS z_;?fdts{{34S9#7H0$bW;Y5fv-=FrKY~ekj?sYuC@=t|&{5}5eKjOiCxW0~H+TYW{ zXh>{Ib-(WSbVzk2?On%M+TZIJEu0P+3R1@H@w2$`b@bEgM5xbi_=)JG5>8S0CJ|GU zq8fFZ-3Er(kYWBF#%aFcE|K>Hjv|K<%8&8wcO0v@4^Q)5_Y5C&uizwJ=Y#GIoZ`3T zL9AmGf8opRZ?yh99>PB`fq!BW|Kf!H8)vjGoYVR^osTinIJEzAV+vdmhzq=5;BkS3 iKvG~{U}2M975D(v7x`zf#VIV|8kRXh*U8z3C;kWHvZ^Kk literal 0 HcmV?d00001 diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTest_motion.java b/benchmarks/other/ZigbeeTest/ZigbeeTestMotion.java similarity index 59% rename from benchmarks/other/ZigbeeTest/ZigbeeTest_motion.java rename to benchmarks/other/ZigbeeTest/ZigbeeTestMotion.java index b19eca9..9278c11 100644 --- a/benchmarks/other/ZigbeeTest/ZigbeeTest_motion.java +++ b/benchmarks/other/ZigbeeTest/ZigbeeTestMotion.java @@ -3,44 +3,36 @@ import java.net.*; import java.io.*; import java.util.*; -import iotruntime.*; -import iotruntime.zigbee.*; - -//import iotcode.interfaces.*; -import java.rmi.RemoteException; - -public class ZigbeeTest_motion implements SmartthingsSensorCallback { +public class ZigbeeTestMotion implements SmartthingsSensorCallback { public final int SOCKET_SEND_BUFFER_SIZE = 1024; public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; private static final String MY_IP_ADDRESS = "192.168.1.198"; - public static final String DEVIDE_MAC_ADDRESS = "000d6f000bbd5398"; //motion + private static final String DEVICE_MAC_ADDRESS = "000d6f000bbd5398"; //motion + private static final String GATEWAY = "192.168.1.192"; + private static final int LOCAL_COMM_SOCKET = 5956; -//000d6f000bbd5398 -//000d6f00057c92a7 public void newReadingAvailable(int _value, boolean _activeValue) { System.out.println("New Message!!!!"); System.out.println("motion : "+ _value); System.out.println("active? : "+ _activeValue); } - public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{ + public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException { String message = "type: policy_set\n"; message += "ip_address: " + MY_IP_ADDRESS + "\n"; // local ip address - message += "port: " + "5956\n"; // port number - message += "device_address_long: " + DEVIDE_MAC_ADDRESS + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("192.168.1.192"), 5005); // address and port of the gateway which means Raspberry PI's IP address - //DatagramSocket socket = new DatagramSocket(11222); + message += "port: " + LOCAL_COMM_SOCKET + "\n"; // port number + message += "device_address_long: " + DEVICE_MAC_ADDRESS + "\n"; + DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(GATEWAY), 5005); // address and port of the gateway which means Raspberry PI's IP address DatagramSocket socket = new DatagramSocket(12345); socket.setSendBufferSize(4096); socket.setReceiveBufferSize(4096); socket.send(sendPacket); - socket.setReuseAddress(true); - socket.close(); + socket.setReuseAddress(true); + socket.close(); - //IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.2.227", 5956, 5005,false,false); - IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.1.192", 5956, 5005,false,false); - IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVIDE_MAC_ADDRESS); + IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false); + IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS); Set zigSet = new HashSet(); zigSet.add(zigAddrLong); @@ -54,8 +46,8 @@ public class ZigbeeTest_motion implements SmartthingsSensorCallback { System.out.println("About to init"); sen.init(); - ZigbeeTest_motion zTest = new ZigbeeTest_motion(); - sen.registerCallback(zTest); + ZigbeeTestMotion zTest = new ZigbeeTestMotion(); + sen.registerCallback(zTest); System.out.println("Loop Begin"); while (true) { diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTestMultipurpose.class b/benchmarks/other/ZigbeeTest/ZigbeeTestMultipurpose.class new file mode 100644 index 0000000000000000000000000000000000000000..3a8d536009876bcac0d701cca03da0a6d5276885 GIT binary patch literal 2828 zcmaJ@S$i8-8Ga|0ea2%Yv1G@N5+_v}n#xYSB~BX4rKv0{ji_X&mg7_oAV$)OGKn-J zq>)p%K+C?grKK%9W$DgN7bL(Bz2b@s?)d{;a>FeT@E*yFoVeJJzN7Q)yUt(#^QR90 zOrc?566tRAVnuA0cerjDXO z$$$+_^LX;X3*iZ`u24l-w=34;8_iWsfFkxv87BZHb0k{y?o(9 zY%!CHuf#NHaSeN;j$L(4+g&z`HQ51ppyAMl$YLxSi!aA^O6^UiGx1BA$lTmwES1vW zPuwt9&GDjX7sgX=#j*=CI-VnbF18$x#xluBbemZ`99fE8iKI375)08tA`@LmCNnK_ zG(JeLx*o7>%Y9HoM`(CigD2|brH1_p%a-%CQdU-$%xsaEK3m>elxCg=BdexWY+*Y? z@s*}n$+T<@1EH&Tx~J%SQ?8l2nKa8yZ35pEc%H>#X_$QGUEl>~nF(e!H5jqSbF%DO z%$2~m1YQ()N#JD?QckUslNT)I(cu-Vkd<;tR^4Q+=vw7krR-GYn97eA=kbsir!nQl z{g@K?win;QcNy5cycJB!YSk>rWBe2No)_Q84_LU{^Ez9zig{U~OsP$MFdX#ahxm~K zuXyoe{Df|qIoDd1=Qn6SWxCz9vJ3~yPSMJ(WvbFOn4I1HW&N#k#?0p{^eP;joIW)+ zdG_4c@~t{Hh+3*@-!J+ z(b&=*pEF&vP%%rFSOCd%KkvoQ@G48vZt0Z3YhJvLH&o)@+)X^?C~-x8%Zs-a__+eV zz%RY{6@Kl-Z}5)>nFq2^k}@r!2ldP@2H zf)~HTJ8V{}Cqi+)%a(61drI0>r=lqDF}6t7skuSd399Dy;(gT&zek;=N;pnAI4cXP zU3<4nzL32kbFPL!s$^DN_d46W+EN)ci^VK+cU#8JaU^zW_8m%F^GU(&km$XJBh9-i z&Sm?i?cB02I#qY8=QSMMqPMc%MmoCfa@=-hrBW-qGT+9~*JQAq@%Ta;wk^`sTGf>$ z&O0-t;XrF%$$yEv#HGj5EX^>sO*L(34Wg`=icH;s(C&lYWtPj*&TAOmjo}WNjTxiC zp-_DI|B!Xp+015t=uXC_f|Wb*+xqo_bZ6IGS>=uk4PTwr(7%=CI7_kBm)%Xqd9%b7 zGxFg&`v*bi!vvW}d~`QO(vU%nYw^ z!ZswE)5z9s+UpA?T4Ok~c{Za{lg93^aJ1N9mF=-P8cKZVP*EX{@n>|BKZB>x1)o~k z{CA}wIW4f$yT*iRF^%!vZ#-CXdQR0BbfFN_y%JX>*#3USeP;2o%SDZ;3MJAb=<@7PlUSyU4hO&;@&;DvW`$X z(AB_jSZq@DfFAI)QFTS_UdKo}&>avBoD3T(rL@}>U~r@B=%v=Na8JMpFr(v&I6>lD z%$VvFRj3=RHZZ_~4D$aVPV#Mcp18+w7)euQtrqgcgVc#`kEr})r&5y$ZgA9`=% z1b<=f#X5%Z7ryBJM(MxfKKuh?_$S8kFLvm^aZ2mJl-9%Ue3+I-q5YQ^ufRotxWLB* l9uY_gBn9RL7B=A}fk(-{$dADir?7;}SY`)ZA!ZLA`yT-Dw6OpH literal 0 HcmV?d00001 diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTest_multipurpose.java b/benchmarks/other/ZigbeeTest/ZigbeeTestMultipurpose.java similarity index 60% rename from benchmarks/other/ZigbeeTest/ZigbeeTest_multipurpose.java rename to benchmarks/other/ZigbeeTest/ZigbeeTestMultipurpose.java index bb5c836..8bc1f50 100644 --- a/benchmarks/other/ZigbeeTest/ZigbeeTest_multipurpose.java +++ b/benchmarks/other/ZigbeeTest/ZigbeeTestMultipurpose.java @@ -3,17 +3,13 @@ import java.net.*; import java.io.*; import java.util.*; -import iotruntime.*; -import iotruntime.zigbee.*; - -//import iotcode.interfaces.*; -import java.rmi.RemoteException; - -public class ZigbeeTest_multipurpose implements SmartthingsSensorCallback { +public class ZigbeeTestMultipurpose implements SmartthingsSensorCallback { public final int SOCKET_SEND_BUFFER_SIZE = 1024; public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; private static final String MY_IP_ADDRESS = "192.168.1.198"; - public static final String DEVIDE_MAC_ADDRESS = "000d6f000bbd3413"; //Multipurpose sensor + private static final String DEVICE_MAC_ADDRESS = "000d6f000bbd3413"; //Multipurpose sensor + private static final String GATEWAY = "192.168.1.192"; + private static final int LOCAL_COMM_SOCKET = 5957; public void newReadingAvailable(int _value, boolean _activeValue) { System.out.println("New Message!!!!"); @@ -21,25 +17,22 @@ public class ZigbeeTest_multipurpose implements SmartthingsSensorCallback { System.out.println("active? : "+ _activeValue); } - public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{ + public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException { String message = "type: policy_set\n"; message += "ip_address: " + MY_IP_ADDRESS + "\n"; // local ip address - message += "port: " + "5957\n"; // port number - //message += "port: " + "5956\n"; // port number - message += "device_address_long: " + DEVIDE_MAC_ADDRESS + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("192.168.1.192"), 5005); - //DatagramSocket socket = new DatagramSocket(11111); + message += "port: " + LOCAL_COMM_SOCKET + "\n"; // port number + message += "device_address_long: " + DEVICE_MAC_ADDRESS + "\n"; + DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(GATEWAY), 5005); DatagramSocket socket = new DatagramSocket(12345); socket.setSendBufferSize(4096); socket.setReceiveBufferSize(4096); socket.send(sendPacket); - socket.setReuseAddress(true); - socket.close(); + socket.setReuseAddress(true); + socket.close(); - IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.1.192", 5957, 5005,false,false); - //IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.2.227", 5956, 5005,false,false); - IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVIDE_MAC_ADDRESS); + IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false); + IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS); Set zigSet = new HashSet(); zigSet.add(zigAddrLong); @@ -53,8 +46,8 @@ public class ZigbeeTest_multipurpose implements SmartthingsSensorCallback { System.out.println("About to init"); sen.init(); - ZigbeeTest_multipurpose zTest = new ZigbeeTest_multipurpose(); - sen.registerCallback(zTest); + ZigbeeTestMultipurpose zTest = new ZigbeeTestMultipurpose(); + sen.registerCallback(zTest); System.out.println("Loop Begin"); while (true) { diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTestWaterleak.class b/benchmarks/other/ZigbeeTest/ZigbeeTestWaterleak.class new file mode 100644 index 0000000000000000000000000000000000000000..f1304d66f6515033a0549dd2fb4ddb340374a5fb GIT binary patch literal 2817 zcmaJ@S$i8-8Ga|0ea7QSV#$sjB~Gd|G?krt%hp&fO=VebL}fczj#D{+7)vM0B=U@q zMt0o-E&Ezp%D$AHmK|C^0{qY`uDIZyKfon7-0}eL8F`Tt7wOS=biRE(=lu0Qe|ihR z1vCtdBio5?EGuxc6Ys%$b-d3&4(}JR3BI&KTtI_~JWtD_{a zYQTZ3qio;hhd8+Z`U3%p?9A!NJo z5qwnOV+Nx5xWFe24B?YHKBd-A8+16U{(VNrX9Yed@OcgWnfb(1$;DhIIX9h~x;`_L zT*zfo%SjDdO2ff~>r_3<@s_MoO|}66XgIbdvXD$9Q%lLcQU_e0q8znaOAf zrSDj4)@aFcilZ5?Vmrl29WN3;om@&KlDXM#bvNyxahN?y*`%A=#pc5y|@MOpQ3Se~quq;+>hCC9`SJYnKIE|_=} z7X-dy;;Z-?qneZJky%--T19z^AAzr%_y)eos@|-@onkC9Ha1qcbc@g`SdU(m=gHU% z#F5_UwB=dFinV%;iI+_COD4XLA26U+OXmcBXyQlsvC7$N`-x{K+;Fl(Tg(oz0r`*M9-^F+{ASLkYCcYW_7M`eky;iI&LC`Nj&9h6RSFP&pjPm(q z6TiV5Y*MNxLUF#yGWz9CvmzPkRNaa~|CWKpSKOKx@!W{&XcNCvP4IivS){bnXbqyQm`Y6Dk?8)@-C>o>(kW;d-jCrvnXTEP z!GUOM@c)o?&)v>uZ}fgfU%~SI_+9;aQF>Dwo~-g7E5%T;C@*H4i6{c#pZpliXCH z9jN-L9N6+gY27=@lS<)XU$|D4J0S$3{z=@PFS%7}5APF2Dz)tMv{?lfYfm+sqcAzR z%$sCO(jP^(u5Yg=nr_bE93)|&jzdktuAvZ30EcO!n>h(0h7dZD#0ZVPRn_NAM4f;GY=9zu2Mw#yPDG7ql*R=aaNF4DG+%m;zS?QUdQ1 mcuF8GFe@-8Fux723A~%^3;Y=@aR!UHjwN=`4Pp-9>Hh&A*sn7H literal 0 HcmV?d00001 diff --git a/benchmarks/other/ZigbeeTest/ZigbeeTest_waterleak.java b/benchmarks/other/ZigbeeTest/ZigbeeTestWaterleak.java similarity index 59% rename from benchmarks/other/ZigbeeTest/ZigbeeTest_waterleak.java rename to benchmarks/other/ZigbeeTest/ZigbeeTestWaterleak.java index 11dbb30..9d7281f 100644 --- a/benchmarks/other/ZigbeeTest/ZigbeeTest_waterleak.java +++ b/benchmarks/other/ZigbeeTest/ZigbeeTestWaterleak.java @@ -3,18 +3,13 @@ import java.net.*; import java.io.*; import java.util.*; -import iotruntime.*; -import iotruntime.zigbee.*; - -//import iotcode.interfaces.*; -import java.rmi.RemoteException; - -public class ZigbeeTest_waterleak implements SmartthingsSensorCallback { +public class ZigbeeTestWaterleak implements SmartthingsSensorCallback { public final int SOCKET_SEND_BUFFER_SIZE = 1024; public final int SOCKET_RECEIVE_BUFFER_SIZE = 1024; private static final String MY_IP_ADDRESS = "192.168.1.198"; - private static final int PORT_NUMBER = 5959; - public static final String DEVIDE_MAC_ADDRESS = "000d6f000ada75e3"; //water leak + private static final String DEVICE_MAC_ADDRESS = "000d6f000ada75e3"; //water leak + private static final String GATEWAY = "192.168.1.192"; + private static final int LOCAL_COMM_SOCKET = 5958; public void newReadingAvailable(int _value, boolean _activeValue) { System.out.println("New Message!!!!"); @@ -22,24 +17,22 @@ public class ZigbeeTest_waterleak implements SmartthingsSensorCallback { System.out.println("active? : "+ _activeValue); } - public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{ + public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException { String message = "type: policy_set\n"; message += "ip_address: " + MY_IP_ADDRESS + "\n"; // local ip address - message += "port: " + PORT_NUMBER + "\n"; // port number - message += "device_address_long: " + DEVIDE_MAC_ADDRESS + "\n"; - DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("192.168.1.192"), 5005); // address and port of the gateway which means Raspberry PI's IP address - //DatagramSocket socket = new DatagramSocket(22222); + message += "port: " + LOCAL_COMM_SOCKET + "\n"; // port number + message += "device_address_long: " + DEVICE_MAC_ADDRESS + "\n"; + DatagramPacket sendPacket = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(GATEWAY), 5005); // address and port of the gateway which means Raspberry PI's IP address DatagramSocket socket = new DatagramSocket(12345); socket.setSendBufferSize(4096); socket.setReceiveBufferSize(4096); socket.send(sendPacket); - socket.setReuseAddress(true); - socket.close(); + socket.setReuseAddress(true); + socket.close(); - //IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.2.227", PORT_NUMBER, 5005,false,false); - IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.1.192", PORT_NUMBER, 5005,false,false); - IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVIDE_MAC_ADDRESS); + IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false); + IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS); Set zigSet = new HashSet(); zigSet.add(zigAddrLong); @@ -53,7 +46,7 @@ public class ZigbeeTest_waterleak implements SmartthingsSensorCallback { System.out.println("About to init"); sen.init(); - ZigbeeTest_waterleak zTest = new ZigbeeTest_waterleak(); + ZigbeeTestWaterleak zTest = new ZigbeeTestWaterleak(); sen.registerCallback(zTest); System.out.println("Loop Begin"); diff --git a/benchmarks/other/ZigbeeTest/build.bash b/benchmarks/other/ZigbeeTest/build.bash deleted file mode 100755 index b74dfc1..0000000 --- a/benchmarks/other/ZigbeeTest/build.bash +++ /dev/null @@ -1,3 +0,0 @@ -cwd=$(pwd) -cd $cwd -javac -cp ./../iotjava:./../../../bin:.:../../packages/build *.java diff --git a/benchmarks/other/ZigbeeTest/buildall.bash b/benchmarks/other/ZigbeeTest/buildall.bash deleted file mode 100755 index 8dc832d..0000000 --- a/benchmarks/other/ZigbeeTest/buildall.bash +++ /dev/null @@ -1,11 +0,0 @@ -cwd=$(pwd) -cd ./../../.. -make iotjava -cd benchmarks -make nocheck -cd $cwd -cd ../../packages/ -# ./clean.bash -# ./build.bash -cd $cwd -javac -cp ./../../../bin:.:../../packages/build *.java \ No newline at end of file diff --git a/benchmarks/other/ZigbeeTest/clean.bash b/benchmarks/other/ZigbeeTest/clean.bash deleted file mode 100755 index 73c03ab..0000000 --- a/benchmarks/other/ZigbeeTest/clean.bash +++ /dev/null @@ -1 +0,0 @@ -rm -rf *.class diff --git a/benchmarks/other/ZigbeeTest/config.java b/benchmarks/other/ZigbeeTest/config.java deleted file mode 100644 index 9a7fde7..0000000 --- a/benchmarks/other/ZigbeeTest/config.java +++ /dev/null @@ -1,15 +0,0 @@ -//package iotcode.annotation; - -import java.lang.annotation.*; - -/** @config annotation - * This annotation is for the runtime system to instrument IoTSet and IoTRelation - * Re-instated on 12/12/2016 - * - * @author Rahmadi Trimananda - * @version 1.0 - * @since 2016-12-12 - */ -@Retention(RetentionPolicy.RUNTIME) -public @interface config { -} diff --git a/benchmarks/other/ZigbeeTest/run.bash b/benchmarks/other/ZigbeeTest/run.bash deleted file mode 100755 index 35f58eb..0000000 --- a/benchmarks/other/ZigbeeTest/run.bash +++ /dev/null @@ -1,2 +0,0 @@ -#java -cp ./../../../bin:.:../../packages/build ZigbeeTest -java -cp ./../iotjava:./../../../bin:. ZigbeeTest diff --git a/benchmarks/other/ZigbeeTest/run_doorlock.bash b/benchmarks/other/ZigbeeTest/run_doorlock.bash deleted file mode 100755 index 688e338..0000000 --- a/benchmarks/other/ZigbeeTest/run_doorlock.bash +++ /dev/null @@ -1 +0,0 @@ -java -cp ./../iotjava:./../../../bin:. ZigbeeTest_doorlock diff --git a/benchmarks/other/ZigbeeTest/run_motion.bash b/benchmarks/other/ZigbeeTest/run_motion.bash deleted file mode 100755 index e5baba1..0000000 --- a/benchmarks/other/ZigbeeTest/run_motion.bash +++ /dev/null @@ -1 +0,0 @@ -java -cp ./../iotjava:./../../../bin:. ZigbeeTest_motion diff --git a/benchmarks/other/ZigbeeTest/run_multipurpose.bash b/benchmarks/other/ZigbeeTest/run_multipurpose.bash deleted file mode 100755 index 653b0a2..0000000 --- a/benchmarks/other/ZigbeeTest/run_multipurpose.bash +++ /dev/null @@ -1,2 +0,0 @@ -#java -cp ./../../../bin:.:../../packages/build ZigbeeTest -java -cp ./../iotjava:./../../../bin:. ZigbeeTest_multipurpose diff --git a/benchmarks/other/ZigbeeTest/run_waterleak.bash b/benchmarks/other/ZigbeeTest/run_waterleak.bash deleted file mode 100755 index 76ae633..0000000 --- a/benchmarks/other/ZigbeeTest/run_waterleak.bash +++ /dev/null @@ -1 +0,0 @@ -java -cp ./../iotjava:./../../../bin:. ZigbeeTest_waterleak diff --git a/benchmarks/other/ZigbeeTest/zbtest.jar b/benchmarks/other/ZigbeeTest/zbtest.jar new file mode 100644 index 0000000000000000000000000000000000000000..48c240fbe605c0d18032347711c1c7a26b209ff5 GIT binary patch literal 37721 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%0DJtYC(FVsLa=#akMX3IKsd%@Do4? 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 I*Z=DO0WIS