Skip to content

Instantly share code, notes, and snippets.

@dannysperry
Last active December 10, 2023 09:54
Show Gist options
  • Save dannysperry/23fee9c11259e599fcbd to your computer and use it in GitHub Desktop.
Save dannysperry/23fee9c11259e599fcbd to your computer and use it in GitHub Desktop.
PPPP_Read debugging
read_size = FFI::MemoryPointer.new(:int32, 1)
read_size.write_int32(4)
p2p_buffer_size = 128 * 1024
input_buffer = FFI::MemoryPointer.new(:char, p2p_buffer_size, true)
some_obj = SandBox.new.authenticate read_size, input_buffer, 100000
class SandBox
def authenticate(read_size, input_buffer, timeout=100000)
# aes_init
#connect or deinit
session_handle = connect 4
puts "session handle from connect is #{session_handle}"
return session_handle if session_handle < 0
sendStreamIOHead(session_handle, S::ENUM_STREAM_IO_TYPE[:SIO_TYPE_AUTH_REQ], 0)
orig_values = OpenStruct.new(input_buffer: input_buffer, read_size: read_size)
puts "started read"
start_time = Time.now
ret = S::S_Read(session_handle, S::P2P_CHANNEL[:P2P_CHANNEL_IOCTRL], input_buffer, read_size, timeout)
end_time = Time.now
puts "read finished"
puts "read took #{end_time - start_time}"
read_object = OpenStruct.new(session_handle: session_handle, input_buffer: input_buffer, read_size: read_size, return_value: ret, original_values: orig_values)
if ret < 0
puts "read failure -- disconnecting and deinitializing"
disconnect(session_handle)
else
puts "read_successfull"
end
read_object
end
private
def aes_init
S::AES.AES_Init
end
def make_struct(struct)
obj_ptr = FFI::MemoryPointer.new struct, struct.size
struct.new(obj_ptr) # wrap ruby object around C pointer
end
def sendStreamIOHead(session_handle, control_type, size)
p_stream_io_head = make_struct(S::Structs::STAVStreamIOHead)
temp = p_stream_io_head
p_stream_io_head[:unionSTreamIOHead][:nStreamIOType] = control_type
p_stream_io_head[:unionSTreamIOHead][:nDataSize][0] = (size & 0xff)
p_stream_io_head[:unionSTreamIOHead][:nDataSize][1] = ((size >> 8) & 0xff)
p_stream_io_head[:unionSTreamIOHead][:nDataSize][2] = ((size >> 16) & 0xff)
S::S_Write(session_handle, S::P2P_CHANNEL[:P2P_CHANNEL_IOCTRL], temp.to_ptr, p_stream_io_head.size )
end
def init_device
p2p_server_cyphertext = "ECGBFFBJKAIEGHJAEBHLFGEMHLNBHCNIGEFCBNCIBIJALMLFCFAPCHODHOLCJNKIBIMCLDCNOBMOAKDMJGNMIJBJML"
puts "Initializing device"
S.S_Initialize(p2p_server_cyphertext)
end
def connect(did=1)
initializer = init_device
puts "Initialized value is #{initializer}"
return "Already initialized" if initializer == -2
device_id = "DOXX-000008-FGJMH" if did == 1
device_id = "DOXX-000003-EZFLJ" if did == 2
device_id = "CHXX-000596-XLUGT" if did == 3
device_id = "DOXX-000007-UWPWD" if did == 4
device_id = "DOXX-000002-EMFHV" if did == 5
puts "Connecting to device #{device_id}"
session_handle = S.S_Connect(device_id, 1, 0)
puts "Checking session_handle with value of #{session_handle}"
session_info = make_struct(Yale::Structs::STPPPPSession)
s_response = S.S_Check(session_handle, session_info.pointer)
if s_response < 0
puts "Check failure, response is #{s_response}."
return disconnect(session_handle)
end
puts "Session handled check successful"
# session_info_b_mode = session_info[:b_mode] == 0 ? "P2P" : "RLY"
# puts "----------Session(#{session_handle}) Ready: #{session_info_b_mode}----------"
# puts "Socket : #{session_info[:skt]}"
# puts "Remote Addr : #{session_info[:remote_address][:addr]}:#{session_info[:remote_address][:port]}"
# puts "My Lan Addr : #{session_info[:my_local_address][:addr]}:#{session_info[:my_local_address][:port]}"
# puts "My Wan Addr : #{session_info[:my_wan_address][:addr]}:#{session_info[:my_wan_address][:port]}"
# puts "Connection time : #{session_info[:connection_time]} second before"
# puts "DID : #{session_info[:did]}"
# puts "I am #{session_info}", (session_info.bCorD ==0) ? "Client" : "Device"
# puts "Connection mode: #{session_info_b_mode}"
# puts "----------End of Session info :----------"
session_handle
end
def disconnect(session_handle, hard_disconnect=false)
if hard_disconnect
puts "Disconnecting device. Force closing session handle ##{session_handle}"
S.S_ForceClose(session_handle)
else
puts "Disconnecting device. Closing session handle ##{session_handle}"
S.S_Close(session_handle)
end
deinit_device
end
def deinit_device
puts "Deinitializing..."
S.S_DeInitialize
end
end
module S
extend FFI::Library
ffi_lib Sample.ffi_lib_path, FFI::Library::LIBC
P2P_CHANNEL = enum(:P2P_CHANNEL_IOCTRL,
:P2P_CHANNEL_DATA,
:P2P_CHANNEL_AVDATA_CtoD,
:P2P_CHANNEL_DATA_PLAYBACK,
:P2P_CHANNEL_FILE_DOWNLOAD )
AUTH_TYPE = enum(:AUTH_TYPE_UNKN,
:AUTH_TYPE_REQ,
:AUTH_TYPE_RESP,
:AUTH_TYPE_OK,
:AUTH_TYPE_FAILED )
MENU_ITEM = enum(:MENU_ITEM_EXIT,
:MENU_ITEM_GET_VIDEO_FRAME,
:MENU_ITEM_GET_AUDIO_FRAME,
:MENU_ITEM_GET_VIDEO_AUDIO_FRAME,
:MENU_ITEM_GET_DEVICE_INFO,
:MENU_ITEM_DUMP_VIDEO_FRAME,
:MENU_ITEM_DUMP_AUDIO_FRAME,
:MENU_ITEM_DUMP_VIDEO_AUDIO_FRAME,
:MENU_ITEM_SEND_AUDIO_DATA,
:MENU_ITEM_VEDIO_RESOLUTION,
:MENU_ITEM_VEDIO_FRAME_RAME,
:MENU_ITEM_VEDIO_BRIGHTNESS,
:MENU_ITEM_VEDIO_BITRATE,
:MENU_ITEM_CONTRAST,
:MENU_ITEM_SATURATION,
:MENU_ITEM_INFRARED,
:MENU_ITEM_FLIP,
:MENU_ITEM_MIRROR,
:MENU_ITEM_RECODE_STATUS,
:MENU_ITEM_RECODE_MODE,
:MENU_ITEM_RECODE_CYCLE_TIME,
:MENU_ITEM_RECODE_DATE_TIME,
:MENU_ITEM_PHOTO_CAPTURE,
:MENU_ITEM_GET_PICTURE,
:MENU_ITEM_GET_RECORD,
:MENU_ITEM_SET_PASSWORD,
:MENU_ITEM_SET_DID,
:MENU_ITEM_SET_AP_SSID,
:MENU_ITEM_SET_AP_PASSWORD,
:MENU_ITEM_UPDATE_FW )
ENUM_STREAM_IO_TYPE = enum(:SIO_TYPE_AUTH, 1,
:SIO_TYPE_VIDEO,
:SIO_TYPE_AUDIO,
:SIO_TYPE_IOCTRL,
:SIO_TYPE_FILE,
:SIO_TYPE_AUTH_REQ)
ENUM_CODECID = enum(:CODECID_UNKN,
:CODECID_V_MJPEG,
:CODECID_V_MPEG4,
:CODECID_V_H264,
:CODECID_A_PCM, 0x4FF,
:CODECID_A_ADPCM,
:CODECID_A_SPEEX,
:CODECID_A_AMR,
:CODECID_A_AAC)
ENUM_VFRAME = enum(:VFRAME_FLAG_I, :VFRAME_FLAG_P, :VFRAME_FLAG_B)
ENUM_AUDIO_SAMPLERATE = enum(:ASAMPLE_RATE_8K,
:ASAMPLE_RATE_11K,
:ASAMPLE_RATE_12K,
:ASAMPLE_RATE_16K,
:ASAMPLE_RATE_22K,
:ASAMPLE_RATE_24K,
:ASAMPLE_RATE_32K,
:ASAMPLE_RATE_44K,
:ASAMPLE_RATE_48K)
ENUM_AUDIO_DATABITS = enum(:ADATABITS_8, :ADATABITS_16)
ENUM_AUDIO_CHANNEL = enum(:ACHANNEL_MONO, :ACHANNEL_STERO)
ENUM_PTZ_COMMAND = enum(:IOCTRL_PTZ_STOP,
:IOCTRL_PTZ_UP,
:IOCTRL_PTZ_DOWN ,
:IOCTRL_PTZ_LEFT ,
:IOCTRL_PTZ_RIGHT,
:IOCTRL_PTZ_LEFT_UP,
:IOCTRL_PTZ_LEFT_DOWN ,
:IOCTRL_PTZ_RIGHT_UP,
:IOCTRL_PTZ_RIGHT_DOWN,
:IOCTRL_LENS_ZOOM_IN ,
:IOCTRL_LENS_ZOOM_OUT,
:IOCTRL_PTZ_AUTO_SCAN,
:IOCTRL_PTZ_PRESET_POINT,
:IOCTRL_PTZ_SET_PRESET_POINT)
ENUM_VIDEO_RESOLUTION = enum(:VGA, :HD)
ENUM_VIDEO_FRAME_RATE = enum(:FIVE, :TEN, :FIFTEEN, :TWENTY, :TWENTY_FIVE, :THIRTY)
ENUM_VIDEO_SETTING = enum(:ON, :OFF, :AUTO, :PHOTO, :VIDEO, :READ, :SET)
ENUM_FRAMERATE = enum(:FRAME_5, :FRAME_10, :FRAME_15, :FRAME_20, :FRAME_25, :FRAME_30)
ENUM_BITRATE = enum(:BITRATE_512, :BITRATE_1024, :BITRATE_1536, :BITRATE_2048, :BITRATE_3072, :BITRATE_4096)
ENUM_FLIP = enum(:NO_FLIP, :FLIP)
ENUM_MIRROR = enum(:NO_MIRROR, :MIRROR)
ENUM_IOCTRL_TYPE = enum(:IOCTRL_TYPE_PUSH_CamIndex,
:IOCTRL_TYPE_VIDEO_START,
:IOCTRL_TYPE_VIDEO_STOP,
:IOCTRL_TYPE_AUDIO_START,
:IOCTRL_TYPE_AUDIO_STOP,
:IOCTRL_TYPE_DEVINFO_REQ,
:IOCTRL_TYPE_DEVINFO_RESP,
:IOCTRL_TYPE_RECORD_PLAYCONTROL_REQ,
:IOCTRL_TYPE_RECORD_PLAYCONTROL_RESP,
:IOCTRL_TYPE_PTZ_COMMAND,
:IOCTRL_TYPE_LISTEVENT_REQ,
:IOCTRL_TYPE_LISTEVENT_RESP,
:IOCTRL_TYPE_EVENT_NOTIFY,
:IOCTRL_TYPE_EMAIL_ON_OFF_REQ,
:IOCTRL_TYPE_EMAIL_ON_OFF_RESP,
:IOCTRL_TYPE_EVENT_NOTIFY_ON_OFF_REQ,
:IOCTRL_TYPE_EVENT_NOTIFY_ON_OFF_RESP,
:IOCTRL_TYPE_GET_ON_OFF_VALUE_REQ,
:IOCTRL_TYPE_GET_ON_OFF_VALUE_RESP,
:IOCTRL_TYPE_SPEAKER_START,
:IOCTRL_TYPE_SPEAKER_STOP,
:IOCTRL_TYPE_SETPASSWORD_REQ,
:IOCTRL_TYPE_SETPASSWORD_RESP,
:IOCTRL_TYPE_SET_VIDEO_PARAMETER_REQ,
:IOCTRL_TYPE_SET_VIDEO_PARAMETER_RESP,
:IOCTRL_TYPE_GET_VIDEO_PARAMETER_REQ,
:IOCTRL_TYPE_GET_VIDEO_PARAMETER_RESP,
:IOCTRL_TYPE_LISTWIFIAP_REQ,
:IOCTRL_TYPE_LISTWIFIAP_RESP,
:IOCTRL_TYPE_SETWIFI_REQ,
:IOCTRL_TYPE_SETWIFI_RESP,
:IOCTRL_TYPE_SETMOTIONDETECT_REQ,
:IOCTRL_TYPE_SETMOTIONDETECT_RESP,
:IOCTRL_TYPE_GETMOTIONDETECT_REQ,
:IOCTRL_TYPE_GETMOTIONDETECT_RESP,
:IOCTRL_TYPE_SETRECORD_REQ,
:IOCTRL_TYPE_SETRECORD_RESP,
:IOCTRL_TYPE_GETRECORD_REQ,
:IOCTRL_TYPE_GETRECORD_RESP,
:IOCTRL_TYPE_FORMATEXTSTORAGE_REQ,
:IOCTRL_TYPE_FORMATEXTSTORAGE_RESP,
:IOCTRL_TYPE_MANU_REC_START,
:IOCTRL_TYPE_MANU_REC_STOP,
:IOCTRL_TYPE_SET_EMAIL_REQ,
:IOCTRL_TYPE_SET_EMAIL_RESP,
:IOCTRL_TYPE_GET_EMAIL_REQ,
:IOCTRL_TYPE_GET_EMAIL_RESP,
:IOCTRL_TYPE_AUTH_ADMIN_PASSWORD_REQ,
:IOCTRL_TYPE_AUTH_ADMIN_PASSWORD_RESP,
:IOCTRL_TYPE_SET_ADMIN_PASSWORD_REQ,
:IOCTRL_TYPE_SET_ADMIN_PASSWORD_RESP,
:IOCTRL_TYPE_GETWIFI_REQ,
:IOCTRL_TYPE_GETWIFI_RESP,
:IOCTRL_TYPE_PUSH_APP_UTC_TIME,
:IOCTRL_TYPE_SET_TIMEZONE_REQ,
:IOCTRL_TYPE_SET_TIMEZONE_RESP,
:IOCTRL_TYPE_GET_TIMEZONE_REQ,
:IOCTRL_TYPE_GET_TIMEZONE_RESP,
:IOCTRL_TYPE_APNS_SET_TOKENID_REQ,
:IOCTRL_TYPE_APNS_SET_TOKENID_RESP,
:IOCTRL_TYPE_APNS_SET_CERT_REQ,
:IOCTRL_TYPE_APNS_SET_CERT_RESP,
:IOCTRL_TYPE_APNS_PUSH_IP_REQ,
:IOCTRL_TYPE_APNS_PUSH_IP_RESP,
:IOCTRL_TYPE_AUTO_DEL_REC_ON_OFF_REQ,
:IOCTRL_TYPE_SETDETECTMODE_REQ,
:IOCTRL_TYPE_SETDETECTMODE_RESP,
:IOCTRL_TYPE_GETDETECTMODE_REQ,
:IOCTRL_TYPE_GETDETECTMODE_RESP,
:IOCTRL_TYPE_SET_APNS_SERVER_PUSH_REQ,
:IOCTRL_TYPE_SET_APNS_SERVER_PUSH_RESP,
:IOCTRL_TYPE_GET_APNS_SERVER_PUSH_REQ,
:IOCTRL_TYPE_GET_APNS_SERVER_PUSH_RESP,
:IOCTRL_TYPE_SET_MOTION_SENSITIVITY_REQ,
:IOCTRL_TYPE_SET_MOTION_SENSITIVITY_RESP,
:IOCTRL_TYPE_GET_MOTION_SENSITIVITY_REQ,
:IOCTRL_TYPE_GET_MOTION_SENSITIVITY_RESP,
:IOCTRL_TYPE_SET_SYSTEM_REBOOT_REQ,
:IOCTRL_TYPE_SET_SYSTEM_REBOOT_RESP,
:IOCTRL_TYPE_SET_DEVICE_CUSTOM_INFO_REQ,
:IOCTRL_TYPE_SET_DEVICE_CUSTOM_INFO_RESP,
:IOCTRL_TYPE_GET_DEVICE_CUSTOM_INFO_REQ,
:IOCTRL_TYPE_GET_DEVICE_CUSTOM_INFO_RESP,
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_STATUS_REQ,
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_STATUS_RESP,
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_REQ,
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_RESP,
:IOCTRL_TYPE_SET_VIDEO_DWDR_SWITCH_REQ,
:IOCTRL_TYPE_SET_VIDEO_DWDR_SWITCH_RESP,
:IOCTRL_TYPE_GET_VIDEO_DWDR_SWITCH_REQ,
:IOCTRL_TYPE_GET_VIDEO_DWDR_SWITCH_RESP,
:IOCTRL_TYPE_GET_ONET_DEVINFO_REQ,
:IOCTRL_TYPE_GET_ONET_DEVINFO_RESP,
:IOCTRL_TYPE_SET_ONET_DEVINFO_REQ,
:IOCTRL_TYPE_SET_ONET_DEVINFO_RESP,
:IOCTRL_TYPE_SET_ONET_STATUS_REQ ,
:IOCTRL_TYPE_SET_ONET_STATUS_RESP,
:IOCTRL_TYPE_REMOVE_EVENTLIST_REQ,
:IOCTRL_TYPE_REMOVE_EVENTLIST_RESP,
:IOCTRL_TYPE_REMOVE_EVENT_REQ,
:IOCTRL_TYPE_REMOVE_EVENT_RESP,
:IOCTRL_TYPE_UPGRADE_FIRMWARE_REQ,
:IOCTRL_TYPE_UPGRADE_FIRMWARE_RESP,
:IOCTRL_TYPE_GET_VIDEO_BRIGHTNESS_REQ,
:IOCTRL_TYPE_GET_VIDEO_BRIGHTNESS_RESP,
:IOCTRL_TYPE_SET_VIDEO_BRIGHTNESS_REQ ,
:IOCTRL_TYPE_SET_VIDEO_BRIGHTNESS_RESP,
:IOCTRL_TYPE_GET_VIDEO_CONTRAST_REQ,
:IOCTRL_TYPE_GET_VIDEO_CONTRAST_RESP,
:IOCTRL_TYPE_SET_VIDEO_CONTRAST_REQ ,
:IOCTRL_TYPE_SET_VIDEO_CONTRAST_RESP,
:IOCTRL_TYPE_SET_VIDEO_DWDR_INTENSITY_REQ,
:IOCTRL_TYPE_SET_VIDEO_DWDR_INTENSITY_RESP,
:IOCTRL_TYPE_GET_VIDEO_DWDR_INTENSITY_REQ,
:IOCTRL_TYPE_GET_VIDEO_DWDR_INTENSITY_RESP,
:IOCTRL_TYPE_MPTEST_GPIO_REQ,
:IOCTRL_TYPE_MPTEST_GPIO_RESP,
:IOCTRL_TYPE_MPTEST_RESETPIN_REQ,
:IOCTRL_TYPE_MPTEST_RESETPIN_RESP,
:IOCTRL_TYPE_SET_VIDEO_RESOLUTION_REQ,
:IOCTRL_TYPE_SET_VIDEO_RESOLUTION_RESP,
:IOCTRL_TYPE_SET_VIDEO_FRAME_RATE_REQ,
:IOCTRL_TYPE_SET_VIDEO_FRAME_RATE_RESP,
:IOCTRL_TYPE_SET_VIDEO_BITRATE_REQ,
:IOCTRL_TYPE_SET_VIDEO_BITRATE_RESP,
:IOCTRL_TYPE_SET_VIDEO_SATURATION_REQ,
:IOCTRL_TYPE_SET_VIDEO_SATURATION_RESP,
:IOCTRL_TYPE_SET_INFRARED_REQ,
:IOCTRL_TYPE_SET_INFRARED_RESP,
:IOCTRL_TYPE_SET_VIDEO_FLIP_REQ,
:IOCTRL_TYPE_SET_VIDEO_FLIP_RESP,
:IOCTRL_TYPE_SET_VIDEO_MIRROR_REQ,
:IOCTRL_TYPE_SET_VIDEO_MIRROR_RESP,
:IOCTRL_TYPE_SET_VIDEO_RECORD_STATUS_REQ,
:IOCTRL_TYPE_SET_VIDEO_RECORD_STATUS_RESP,
:IOCTRL_TYPE_SET_VIDEO_RECORD_MODE_REQ,
:IOCTRL_TYPE_SET_VIDEO_RECORD_MODE_RESP,
:IOCTRL_TYPE_SET_VIDEO_RECORD_CYCLE_TIME_REQ,
:IOCTRL_TYPE_SET_VIDEO_RECORD_CYCLE_TIME_RESP,
:IOCTRL_TYPE_SET_VIDEO_RECORD_DATE_TIME_REQ,
:IOCTRL_TYPE_SET_VIDEO_RECORD_DATE_TIME_RESP,
:IOCTRL_TYPE_SET_PHOTO_CAPTURE_REQ,
:IOCTRL_TYPE_SET_PHOTO_CAPTURE_RESP,
:IOCTRL_TYPE_GET_PICTURE_REQ,
:IOCTRL_TYPE_GET_PICTURE_RESP,
:IOCTRL_TYPE_SET_DID_REQ,
:IOCTRL_TYPE_SET_DID_RESP,
:IOCTRL_TYPE_SET_STA_SSID_REQ,
:IOCTRL_TYPE_SET_STA_SSID_RESP,
:IOCTRL_TYPE_SET_STA_PASSWORD_REQ,
:IOCTRL_TYPE_SET_STA_PASSWORD_RESP)
attach_function :S_GetAPIVersion, [], :uint32
attach_function :S_QueryDID, [:string, :char, :int32], :int32
attach_function :S_Initialize, [:pointer], :int32
attach_function :S_DeInitialize, [], :int32
attach_function :S_NetworkDetect, [:pointer, :uint16], :int32
attach_function :S_NetworkDetectByServer, [:pointer, :uint16, :pointer], :int32
attach_function :S_Share_Bandwidth, [:char], :int32
attach_function :S_Listen, [:string, :uint32, :uint16, :char, :string], :int32
attach_function :S_Listen_Break, [], :int32
attach_function :S_LoginStatus_Check, [:pointer], :int32
attach_function :S_Connect, [:string, :char, :uint16], :int32
attach_function :S_ConnectByServer, [:string, :char, :uint16, :pointer], :int32
attach_function :S_Connect_Break, [],:int32
attach_function :S_Check, [:int32, :pointer], :int32
attach_function :S_Close, [:int32], :int32
attach_function :S_ForceClose, [:int32], :int32
attach_function :S_Write, [:int32, :uchar, :pointer, :int32], :int32
# S_API_API INT32 S_Read(INT32 SessionHandle, UCHAR Channel, CHAR *DataBuf, INT32 *DataSize, UINT32 TimeOut_ms);
attach_function :S_Read, [:int32, :uchar, :pointer, :pointer, :uint32], :int32
attach_function :S_Check_Buffer, [:int32, :uchar, :pointer, :pointer], :int32
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment