+# -----------------------------------------------------------------------------
+# 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
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
ZIGBEE_SERIAL_BAUD = 115200 # Baud rate for above port
# address of our local zigbee radio
-#ZIGBEE_DEVICE_ADDRESS = "0013a20040d99cb4"
ZIGBEE_DEVICE_ADDRESS = "xxxxxxxxxxxxxxxx"
# -----------------------------------------------------------------------------
zigbeeConnection = None
zigbeeConnectionMutex = Lock()
-#singleton mabe by changwoo
+#singleton mabe by Changwoo
matchDescriptorReqSingleton = True
deviceAnnouncementSingleton = True
ManagementPermitJoiningReqSuccess = False
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
# 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()
# -----------------------------------------------------------------------------
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():
)
zigbeeConnectionMutex.release()
- #time.sleep(8)
time.sleep(1)
'''
- global sendSoceket
+ global sendSocket
# construct the message
message = "type: " + packetTypeStr.strip() + "\n"
message += "reason: " + reason + "\n"
# send message in a UDP packet
- sendSoceket.sendto(message,addr)
+ sendSocket.sendto(message,addr)
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'])):
# 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'])
# 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
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)
global zigbeeLongShortAddrMutex
global zigbeeUnregisteredAddresses
global zigbeeUnregisteredAddressesMutex
- global sendSoceket
+ global sendSocket
print "process send address"
message += "response: success\n"
# tell client that we got their request
- sendSoceket.sendto(message,addr)
+ sendSocket.sendto(message,addr)
print "responding", message
# construct
-#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
-#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
payloadData += '\x02'
payloadData += '\x10\x00'
payloadData += '\xF0'
-# payloadData += '\xDA\x9A\xD9\x40\x00\xA2\x13\x00'
payloadData += hexStringToZigbeeHexString(changeEndian(ZIGBEE_DEVICE_ADDRESS))
zigbeeConnectionMutex.acquire()
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
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
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
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()
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
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
global zigbeeLongShortAddr
global zigbeeLongShortAddrMutex
- global zigeeBindRequestMutex
- global zigeeBindRequest
+ global zigbeeBindRequestMutex
+ global zigbeeBindRequest
global zigbeeConnectionMutex
global zigbeeConnection
global zigbeeLongShortAddr
global zigbeeLongShortAddrMutex
- global zigeeBindRequestMutex
- global zigeeBindRequest
+ global zigbeeBindRequestMutex
+ global zigbeeBindRequest
global zigbeeConnectionMutex
global zigbeeConnection
# 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)):
parsedData -- Pre-parsed (into a dict) data from message.
'''
- global zigeeBindRequestMutex
- global zigeeBindRequest
+ global zigbeeBindRequestMutex
+ global zigbeeBindRequest
global zigbeeConnectionMutex
global zigbeeConnection
global ManagementPermitJoiningReqSuccess
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]
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 ''
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'):
# 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()
# 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])
zigbeeUnregisteredAddresses.remove(longAddr)
zigbeeUnregisteredAddressesMutex.release()
-
- # made by changwoo
+ # Added by Changwoo
zigbeeConnectionMutex.acquire()
zigbeeConnection.send('tx_explicit',
frame_id='\x08',
# 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...
# 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):
# 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]
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'
ManagementPermitJoiningReqSuccess = True
- #made by changwoo
+ # Added by Changwoo
else :
print ''
print '[ '+zigbeeHexStringToHexString(parsedData['cluster'])+' ] ...'
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'] )
message += "attributes: success"
message += "\n"
# send the socket
- sendSoceket.sendto(message,tup[0])
+ sendSocket.sendto(message,tup[0])
print(">port : ", tup[0][1])
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
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'])
# 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 = []
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'):
# 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):
# send to all client that want this callback
for ra in retAddr:
- sendSoceket.sendto(message,ra)
+ sendSocket.sendto(message,ra)
# -----------------------------------------------------------------------------
# Communication Callback/Parse Methods
'''
#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 "=================================================================="
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"]
# 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)
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)
# 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
+++ /dev/null
-//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 <rtrimana @ uci.edu>
- * @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<IoTDeviceAddress> DoorlockSensorUdpAddress; //
- @config private IoTSet<IoTZigbeeAddress> DoorlockSensorZigbeeAddress;//
-
- public DoorlockSensor(IoTSet<IoTDeviceAddress> dSet, IoTSet<IoTZigbeeAddress> 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 <IoTZigbeeMessageZclReadAttributesResponse.Attribute> 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);
- }
-}
+++ /dev/null
-\r
-// Java packages\r
-import java.net.Socket;\r
-import java.net.ServerSocket;\r
-import java.net.InetAddress;\r
-import java.net.UnknownHostException;\r
-\r
-/** Class IoTAddress is a wrapper class to pass\r
- * IoTSet of any addresses from master to slave\r
- *\r
- * @author Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>\r
- * @version 1.0\r
- * @since 2016-04-22\r
- */\r
-public class IoTAddress {\r
-\r
- /**\r
- * IoTDeviceAddress class properties\r
- */\r
- protected final InetAddress inetAddress;\r
-\r
- /**\r
- * Class constructor\r
- *\r
- * @param sAddress String address\r
- */\r
- public IoTAddress(String sAddress) throws UnknownHostException {\r
-\r
- inetAddress = InetAddress.getByName(sAddress);\r
- }\r
-\r
- /**\r
- * getHostAddress() method\r
- *\r
- * @return String\r
- */\r
- public String getHostAddress() {\r
-\r
- return inetAddress.getHostAddress();\r
-\r
- }\r
-\r
- /**\r
- * getHostName() method\r
- *\r
- * @return String\r
- */\r
- public String getHostName() {\r
-\r
- return inetAddress.getHostName();\r
-\r
- }\r
-\r
- /**\r
- * getUrl() method\r
- *\r
- * @return String\r
- */\r
- public String getURL(String strURLComplete) {\r
-\r
- //e.g. http:// + inetAddress.getHostAddress() + strURLComplete\r
- // http://192.168.2.254/cgi-bin/mjpg/video.cgi?\r
- return "http://" + inetAddress.getHostAddress() + strURLComplete;\r
-\r
- }\r
-\r
- /**\r
- * getCompleteAddress() method\r
- *\r
- * @return String\r
- */\r
- public String getCompleteAddress() {\r
-\r
- return inetAddress.toString();\r
-\r
- }\r
-}\r
+++ /dev/null
-\r
-// Java packages\r
-import java.net.Socket;\r
-import java.net.ServerSocket;\r
-import java.net.InetAddress;\r
-import java.net.UnknownHostException;\r
-\r
-/** Class IoTDeviceAddress is a wrapper class to pass\r
- * IoTSet of device addresses from master to slave\r
- *\r
- * @author Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>\r
- * @version 1.0\r
- * @since 2016-02-18\r
- */\r
-public class IoTDeviceAddress extends IoTAddress {\r
-\r
- /**\r
- * IoTDeviceAddress class properties\r
- */\r
- private int iSrcPort;\r
- private int iDstPort;\r
- private final String sAddress;\r
-\r
- // the wildcard status of this address\r
- private final boolean isSrcPortWildCard;\r
- private final boolean isDstPortWildCard;\r
-\r
-\r
- /**\r
- * Class constructor\r
- *\r
- * @param sAddress String address\r
- * @param _iSrcPort Source port number\r
- * @param _iDstPort Destination port number\r
- * @param _isSrcPortWildCard Is this source port a wild card (=can change port number)?\r
- * @param _isDstPortWildCard Is this destination port a wild card (=can change port number)?\r
- */\r
- public IoTDeviceAddress(String _sAddress, int _iSrcPort, int _iDstPort, boolean _isSrcPortWildCard, \r
- boolean _isDstPortWildCard) throws UnknownHostException {\r
-\r
- super(_sAddress);\r
- sAddress = _sAddress;\r
- iSrcPort = _iSrcPort;\r
- iDstPort = _iDstPort;\r
-\r
- isSrcPortWildCard = _isSrcPortWildCard;\r
- isDstPortWildCard = _isDstPortWildCard;\r
- }\r
-\r
- /**\r
- * getSourcePortNumber() method\r
- *\r
- * @return int\r
- */\r
- public int getSourcePortNumber() {\r
-\r
- return iSrcPort;\r
-\r
- }\r
-\r
- /**\r
- * getDestinationPortNumber() method\r
- *\r
- * @return int\r
- */\r
- public int getDestinationPortNumber() {\r
-\r
- return iDstPort;\r
-\r
- }\r
-\r
- /**\r
- * setSrcPort() method\r
- *\r
- * @param port Port number\r
- * @return void\r
- */\r
- public void setSrcPort(int port) {\r
- if (isSrcPortWildCard) {\r
- iSrcPort = port;\r
- }\r
- }\r
-\r
- /**\r
- * setDstPort() method\r
- *\r
- * @param port Port number\r
- * @return void\r
- */\r
- public void setDstPort(int port) {\r
- if (isDstPortWildCard) {\r
- iDstPort = port;\r
- }\r
- }\r
-\r
- /**\r
- * getAddress() method\r
- *\r
- * @return String\r
- */\r
- public String getAddress() {\r
- return sAddress;\r
- }\r
-\r
- /**\r
- * getHostAddress() method\r
- *\r
- * @return String\r
- */\r
- public static String getLocalHostAddress() {\r
-\r
- String strLocalHostAddress = null;\r
- try {\r
- strLocalHostAddress = InetAddress.getLocalHost().getHostAddress();\r
- } catch (UnknownHostException ex) {\r
- ex.printStackTrace();\r
- } \r
- return strLocalHostAddress;\r
- }\r
-\r
- /**\r
- * getIsSrcPortWildcard() method\r
- *\r
- * @return boolean\r
- */\r
- public boolean getIsSrcPortWildcard() {\r
- return isSrcPortWildCard;\r
- }\r
-\r
- /**\r
- * getIsDstPortWildcard() method\r
- *\r
- * @return boolean\r
- */\r
- public boolean getIsDstPortWildcard() {\r
- return isDstPortWildCard;\r
- }\r
-}\r
+++ /dev/null
-
-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 <rahmadi.trimananda @ uci.edu>
- * @version 1.0
- * @since 2015-12-01
- */
-public final class IoTRelation<K, V> {
-
- /**
- * Reference to an object Map<T>
- */
- private Map<K,HashSet<V> > mapRelation;
- private int iSize;
-
- /**
- * Class constructor (pass the reference to this immutable wrapper)
- */
- protected IoTRelation(Map<K,HashSet<V>> 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<Map.Entry<K,HashSet<V>>>
- */
- public Set<Map.Entry<K,HashSet<V>>> entrySet() {
-
- return new HashSet<Map.Entry<K,HashSet<V>>>(mapRelation.entrySet());
-
- }
-
- /**
- * Method keySet() inherited from Map interface
- *
- * @return Set<K>
- */
- public Set<K> keySet() {
-
- return new HashSet<K>(mapRelation.keySet());
-
- }
-
- /**
- * Method get() inherited from Map interface
- *
- * @param key The first Object that is usually a key in a Map
- * @return HashSet<V>
- */
- public HashSet<V> get(K key) {
-
- return new HashSet<V>(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;
-
- }
-}
+++ /dev/null
-
-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<T> to implement; we don't provide interfaces to modify
- * the contents, but we do provide means to read them out
- *
- * @author Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>
- * @version 1.0
- * @since 2015-12-01
- */
-public final class IoTSet<T> {
-
- /**
- * Reference to an object Set<T>
- */
- private Set<T> set;
-
- /**
- * Class constructor (pass the reference to this immutable wrapper)
- */
- public IoTSet(Set<T> 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<T> iterator() {
-
- return new HashSet<T>(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<T> values() {
-
- return new HashSet<T>(set);
-
- }
-}
+++ /dev/null
-
-// 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 <ayounis @ uci.edu>, Changwoo Lee <changwl2 @ uci.edu>
- * @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<IoTZigbeeCallback> callbackList = new ArrayList<IoTZigbeeCallback>();
-
- /**
- * 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<Integer> 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<String, String> packetData = new HashMap<String, String>();
- 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<IoTZigbeeMessageZclReadAttributesResponse.Attribute> attrList = new ArrayList<IoTZigbeeMessageZclReadAttributesResponse.Attribute>();
-
- 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<IoTZigbeeMessageZclConfigureReportingResponse.Attribute> attrList = new ArrayList<IoTZigbeeMessageZclConfigureReportingResponse.Attribute>();
-
- 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<IoTZigbeeMessageZclReportAttributes.Attribute> attrList = new ArrayList<IoTZigbeeMessageZclReportAttributes.Attribute>();
-
- 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<String> pairedValues = new ArrayList<String>();
- 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;
- }
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-
-/** Class IoTZigbeeAddress is a wrapper class to pass
- * IoTSet of device addresses from master to slave
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-
-/** Zigbee Callback for when a zigbee message is received.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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);
-}
+++ /dev/null
-
-/** Zigbee Message generic class.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-
-}
+++ /dev/null
-
-
-/** Zigbee Message Send Address Response.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-/** Zigbee Message Zcl Change Switch Response
- *
- * @author Yuting Tan <ytan5 @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-
-/** Zigbee Message Zcl Configure Reporting.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-
-import java.util.List;
-
-/** Zigbee Message Zcl Configure Reporting Response.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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 <Attribute> attributes;
-
- /**
- * Constructor
- */
- public IoTZigbeeMessageZclConfigureReportingResponse(int _packetId, int _clusterId, int _profileId, boolean _allSuccess, List <Attribute> _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 <Attribute>
- */
- public List <Attribute> getAttributes() {
- return attributes;
- }
-}
+++ /dev/null
-
-/** Zigbee Message Zcl Read Attributes.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-
-import java.util.List;
-
-/** Zigbee Message Zcl Read Attributes Response.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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 <Attribute> attributes;
-
- /**
- * Constructor
- */
- public IoTZigbeeMessageZclReadAttributesResponse(int _packetId, int _clusterId, int _profileId, List <Attribute> _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 <Attribute>
- */
- public List <Attribute> getAttributes() {
- return attributes;
- }
-}
+++ /dev/null
-
-import java.util.List;
-
-/** Zigbee Message Zcl Report Attributes.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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 <Attribute> attributes;
-
- /**
- * Constructor
- */
- public IoTZigbeeMessageZclReportAttributes(int _packetId, int _clusterId, int _profileId, List <Attribute> _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 <Attribute>
- */
- public List <Attribute> getAttributes() {
- return attributes;
- }
-}
+++ /dev/null
-/** Zigbee Message Zcl Write Attributes Response.
- *
- * @author changwoo Lee <changwl2 @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-/** Zigbee Message Zcl Zone Status Change Notification.
- *
- * @author changwoo Lee <changwl2 @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-
-/** Zigbee Message Zdo Bind Response.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-}
+++ /dev/null
-
-/** Zigbee Message Zdo UnBind Response.
- *
- * @author Ali Younis <ayounis @ uci.edu>
- * @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;
- }
-}
--- /dev/null
+
+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)
+++ /dev/null
-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);
-}
+++ /dev/null
-import java.util.List;
-import java.util.ArrayList;
-
-public interface MoistureSensorCallback {
- public void newReadingAvailable(int sensorId, float moisture, long timeStampOfLastReading);
-}
+++ /dev/null
-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();
-}
+++ /dev/null
-import java.util.List;
-import java.util.ArrayList;
-
-public interface MoistureSensorSmartCallback {
-
- public void newReadingAvailable(int sensorId, float moisture, long timeStampOfLastReading);
-}
+++ /dev/null
-// 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 <rtrimana @ uci.edu>
- * @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<IoTDeviceAddress> devUdpAddress;
- @config private IoTSet<IoTZigbeeAddress> devZigbeeAddress;
-
- public MotionSensor(IoTSet<IoTDeviceAddress> dSet, IoTSet<IoTZigbeeAddress> 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);
- }
-}
+++ /dev/null
-// 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 <rtrimana @ uci.edu>
- * @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<IoTDeviceAddress> devUdpAddress;
- @config private IoTSet<IoTZigbeeAddress> devZigbeeAddress;
-
- public MultipurposeSensor(IoTSet<IoTDeviceAddress> dSet, IoTSet<IoTZigbeeAddress> 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);
- }
-}
+++ /dev/null
-// 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 <rtrimana @ uci.edu>, 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;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-// Checker annotations
-//import iotchecker.qual.*;
-
-
-/** Smartthings Sensor Callback for when a camera changes state (new frame available).
- *
- * @author Rahmadi Trimananda <rtrimana @ uci.edu>, 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);
-}
+++ /dev/null
-// 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<IoTDeviceAddress> devUdpAddress;
- @config private IoTSet<IoTZigbeeAddress> devZigbeeAddress;
-
- public SpruceSensor(IoTSet<IoTDeviceAddress> _devUdpAddress, IoTSet<IoTZigbeeAddress> _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 <IoTZigbeeMessageZclReportAttributes.Attribute> 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);
- }
-}
+++ /dev/null
-// 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 <rtrimana @ uci.edu>
- * @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<IoTDeviceAddress> devUdpAddress;
- @config private IoTSet<IoTZigbeeAddress> devZigbeeAddress;
-
- public WaterLeakSensor(IoTSet<IoTDeviceAddress> dSet, IoTSet<IoTZigbeeAddress> 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);
- }
-}
+++ /dev/null
-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<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
- zigSet.add(zigAddrLong);
- IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
-
- Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
- devSet.add(zigUdpAddr);
- IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(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) {
-
- }
- }
-}
--- /dev/null
+import java.util.Map;
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+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";
+ 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(int _value, boolean _activeValue) {
+
+ System.out.println("New Message!!!!");
+ int status = _value;
+ switch (status) {
+ case 0:
+ System.out.println("Not fully locked");
+ break;
+ case 1:
+ System.out.println("Locked");
+ break;
+ case 2:
+ System.out.println("Unlocked");
+ break;
+ default:
+ System.out.println("Unknown value: " + status);
+ break;
+ }
+ }
+
+ 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 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(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false);
+ IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS);
+
+ Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
+ zigSet.add(zigAddrLong);
+ IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
+
+ Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
+ devSet.add(zigUdpAddr);
+ IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
+ DoorlockSensor sen = new DoorlockSensor(devIotSet, zigIotSet);
+
+ ZigbeeTestDoorlock zTest = new ZigbeeTestDoorlock();
+ sen.registerCallback(zTest);
+
+ System.out.println("About to init");
+ sen.init();
+
+ System.out.println("Loop Begin");
+ while (true) {
+
+ }
+ }
+
+}
--- /dev/null
+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<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
+ zigSet.add(zigAddrLong);
+ IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
+
+ Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
+ devSet.add(zigUdpAddr);
+ IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(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) {
+
+ }
+ }
+}
--- /dev/null
+import java.util.Map;
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+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";
+ 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;
+
+ 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 {
+
+ 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 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(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false);
+ IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS);
+
+ Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
+ zigSet.add(zigAddrLong);
+ IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
+
+ Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
+ devSet.add(zigUdpAddr);
+ IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
+ MotionSensor sen = new MotionSensor(devIotSet, zigIotSet);
+
+ System.out.println("About to init");
+ sen.init();
+
+ ZigbeeTestMotion zTest = new ZigbeeTestMotion();
+ sen.registerCallback(zTest);
+
+ System.out.println("Loop Begin");
+ while (true) {
+
+ }
+ }
+}
--- /dev/null
+import java.util.Map;
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+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";
+ 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!!!!");
+ System.out.println("multipurpose : "+ _value);
+ System.out.println("active? : "+ _activeValue);
+ }
+
+ 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);
+ 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<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
+ zigSet.add(zigAddrLong);
+ IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
+
+ Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
+ devSet.add(zigUdpAddr);
+ IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
+ MultipurposeSensor sen = new MultipurposeSensor(devIotSet, zigIotSet);
+
+ System.out.println("About to init");
+ sen.init();
+
+ ZigbeeTestMultipurpose zTest = new ZigbeeTestMultipurpose();
+ sen.registerCallback(zTest);
+
+ System.out.println("Loop Begin");
+ while (true) {
+
+ }
+ }
+}
--- /dev/null
+import java.util.Map;
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+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 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!!!!");
+ System.out.println("water leak : "+ _value);
+ System.out.println("active? : "+ _activeValue);
+ }
+
+ 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 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(GATEWAY, LOCAL_COMM_SOCKET, 5005,false,false);
+ IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVICE_MAC_ADDRESS);
+
+ Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
+ zigSet.add(zigAddrLong);
+ IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
+
+ Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
+ devSet.add(zigUdpAddr);
+ IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
+ WaterLeakSensor sen = new WaterLeakSensor(devIotSet, zigIotSet);
+
+ System.out.println("About to init");
+ sen.init();
+
+ ZigbeeTestWaterleak zTest = new ZigbeeTestWaterleak();
+ sen.registerCallback(zTest);
+
+ System.out.println("Loop Begin");
+ while (true) {
+
+ }
+ }
+}
+++ /dev/null
-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_doorlock implements IoTZigbeeCallback {
-public class ZigbeeTest_doorlock 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
-
- //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:
- System.out.println("Not fully locked");
- break;
- case 1:
- System.out.println("Locked");
- break;
- case 2:
- System.out.println("Unlocked");
- break;
- default:
- System.out.println("Unknown value: " + status);
- break;
- }
- }
-
- public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{
-
- 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*/);
- 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);
-
- Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
- zigSet.add(zigAddrLong);
- IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
-
- Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
- devSet.add(zigUdpAddr);
- IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
- DoorlockSensor sen = new DoorlockSensor(devIotSet, zigIotSet);
-
- ZigbeeTest_doorlock zTest = new ZigbeeTest_doorlock();
- 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) {
-
- }
- }
-
-}
+++ /dev/null
-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_motion 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
-
-//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{
-
- 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);
- 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.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);
-
- Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
- zigSet.add(zigAddrLong);
- IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
-
- Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
- devSet.add(zigUdpAddr);
- IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
- MotionSensor sen = new MotionSensor(devIotSet, zigIotSet);
-
- System.out.println("About to init");
- sen.init();
-
- ZigbeeTest_motion zTest = new ZigbeeTest_motion();
- sen.registerCallback(zTest);
-
- System.out.println("Loop Begin");
- while (true) {
-
- }
- }
-}
+++ /dev/null
-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_multipurpose 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
-
- public void newReadingAvailable(int _value, boolean _activeValue) {
- System.out.println("New Message!!!!");
- System.out.println("multipurpose : "+ _value);
- System.out.println("active? : "+ _activeValue);
- }
-
- public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{
-
- 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);
- 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", 5957, 5005,false,false);
- //IoTDeviceAddress zigUdpAddr = new IoTDeviceAddress("192.168.2.227", 5956, 5005,false,false);
- IoTZigbeeAddress zigAddrLong = new IoTZigbeeAddress(DEVIDE_MAC_ADDRESS);
-
- Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
- zigSet.add(zigAddrLong);
- IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
-
- Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
- devSet.add(zigUdpAddr);
- IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
- MultipurposeSensor sen = new MultipurposeSensor(devIotSet, zigIotSet);
-
- System.out.println("About to init");
- sen.init();
-
- ZigbeeTest_multipurpose zTest = new ZigbeeTest_multipurpose();
- sen.registerCallback(zTest);
-
- System.out.println("Loop Begin");
- while (true) {
-
- }
- }
-}
+++ /dev/null
-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_waterleak 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
-
- public void newReadingAvailable(int _value, boolean _activeValue) {
- System.out.println("New Message!!!!");
- System.out.println("water leak : "+ _value);
- System.out.println("active? : "+ _activeValue);
- }
-
- public static void main(String[] args) throws UnknownHostException, SocketException, InterruptedException, IOException, IOException, RemoteException{
-
- 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);
- 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.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);
-
- Set<IoTZigbeeAddress> zigSet = new HashSet<IoTZigbeeAddress>();
- zigSet.add(zigAddrLong);
- IoTSet<IoTZigbeeAddress> zigIotSet = new IoTSet<IoTZigbeeAddress>(zigSet);
-
- Set<IoTDeviceAddress> devSet = new HashSet<IoTDeviceAddress>();
- devSet.add(zigUdpAddr);
- IoTSet<IoTDeviceAddress> devIotSet = new IoTSet<IoTDeviceAddress>(devSet);
- WaterLeakSensor sen = new WaterLeakSensor(devIotSet, zigIotSet);
-
- System.out.println("About to init");
- sen.init();
-
- ZigbeeTest_waterleak zTest = new ZigbeeTest_waterleak();
- sen.registerCallback(zTest);
-
- System.out.println("Loop Begin");
- while (true) {
-
- }
- }
-}
+++ /dev/null
-cwd=$(pwd)
-cd $cwd
-javac -cp ./../iotjava:./../../../bin:.:../../packages/build *.java
+++ /dev/null
-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
+++ /dev/null
-rm -rf *.class
+++ /dev/null
-//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 <rahmadi.trimananda @ uci.edu>
- * @version 1.0
- * @since 2016-12-12
- */
-@Retention(RetentionPolicy.RUNTIME)
-public @interface config {
-}
+++ /dev/null
-#java -cp ./../../../bin:.:../../packages/build ZigbeeTest
-java -cp ./../iotjava:./../../../bin:. ZigbeeTest
+++ /dev/null
-java -cp ./../iotjava:./../../../bin:. ZigbeeTest_doorlock
+++ /dev/null
-java -cp ./../iotjava:./../../../bin:. ZigbeeTest_motion
+++ /dev/null
-#java -cp ./../../../bin:.:../../packages/build ZigbeeTest
-java -cp ./../iotjava:./../../../bin:. ZigbeeTest_multipurpose
+++ /dev/null
-java -cp ./../iotjava:./../../../bin:. ZigbeeTest_waterleak
+
BASE := ..
include $(BASE)/common.mk
#!/bin/bash
-java -cp .:/usr/share/java/*:./../:./../iotcode/:./../iotcode/Lifxtest/ iotruntime.master.IoTMaster Lifxtest
-#java -cp .:/usr/share/java/*:./../:./../iotcode/:./../iotcode/Lifxtest/ iotruntime.master.IoTMaster SmartLightsController
-#java -cp .:/usr/share/java/*:./../:./../iotcode/:./../iotcode/Lifxtest/ iotruntime.master.IoTMaster IrrigationController
-#java -cp .:/usr/share/java/*:./../:./../iotcode/:./../iotcode/Lifxtest/ iotruntime.master.IoTMaster SpeakerController
-#java -cp .:/usr/share/java/*:./../:./../iotcode/:./../iotcode/Lifxtest/ iotruntime.master.IoTMaster HomeSecurityController
+java -cp .:/usr/share/java/*:./../:./../iotcode/ iotruntime.master.IoTMaster Lifxtest
+#java -cp .:/usr/share/java/*:./../:./../iotcode/ iotruntime.master.IoTMaster SmartLightsController
+#java -cp .:/usr/share/java/*:./../:./../iotcode/ iotruntime.master.IoTMaster IrrigationController
+#java -cp .:/usr/share/java/*:./../:./../iotcode/ iotruntime.master.IoTMaster SpeakerController
+#java -cp .:/usr/share/java/*:./../:./../iotcode/ iotruntime.master.IoTMaster HomeSecurityController
# Combination
-#java -cp .:/usr/share/java/*:./../:./../iotcode/:./../iotcode/Lifxtest/ iotruntime.master.IoTMaster HomeSecurityController SmartLightsController SpeakerController IrrigationController
+#java -cp .:/usr/share/java/*:./../:./../iotcode/ iotruntime.master.IoTMaster HomeSecurityController SmartLightsController SpeakerController IrrigationController