{"id":11998,"date":"2024-07-29T14:32:15","date_gmt":"2024-07-29T06:32:15","guid":{"rendered":"https:\/\/www.tosunai.com\/?p=11998"},"modified":"2024-07-29T15:10:35","modified_gmt":"2024-07-29T07:10:35","slug":"vb6-0-realize-can-signal-transceiver-demo","status":"publish","type":"post","link":"https:\/\/www.tosunai.com\/en\/vb6-0-realize-can-signal-transceiver-demo\/","title":{"rendered":"Sharing | Based on VB6.0 to realize CAN signal transceiver Demo"},"content":{"rendered":"
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\tThis article is about the operation of TOSUN series CAN\/CAN FD and LIN devices based on TSMaster. It mainly introduces how to realize the CAN signal transceiver Demo project in TSMaster software.\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

Keywords: CAN message, VB6.0, libTSCAN<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t

\n\t\t\t\t\t
\n\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
Table of Contents for this article<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t
\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t
\n\t\t\t
\n\t\t\t\t<\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t
\n\t\t\t\t\t
\n\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

01\u3001About Demo Project\n\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t

Brief description:<\/strong><\/p>

VB6.0 programming language calls libTSCAN interface to realize hardware scanning, connection, CAN message single frame sending, cycle sending, message receiving, message filtering.<\/p>

\u00a0<\/p>

Typical application requirements.<\/strong><\/p>

For the VB project project which is still under maintenance and development, it is necessary to call TSCAN hardware to realize the message sending and receiving and other operations.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t

\n\t\t\t\t\t
\n\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

02. Technical background<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\tDeclare functions in libTSCAN.dll using Declare statements in VB6.0 that allow VB6.0 to interact with the underlying API. For example: Private Declare Function tscan_connect Lib \"libTSCAN.dll\" (ByVal ADeviceSerial As String, ByRef AHandle As Long) As ByVal ADeviceSerial As String, ByRef AHandle As Long) As Long.\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t
\n\t\t\t\t\t
\n\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

03\u3001Demo project realization<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t

1. Add library files<\/h3>

To realize the operation of TOSUN series CAN\/CAN FD, LIN devices, it needs to be based on libTSCAN.dll, libTSH.dll, binlog.dll and liblog.dll dynamic link library files. The dependencies between them are shown in Figure 1 below.<\/p>

\u00a0<\/p>

The locations of libTSCAN.dll, libTSH.dll, binlog.dll and liblog.dll dynamic link library files can be obtained from the TSMaster installation directory. c:\\Program Files (x86)\\TOSUN\\TSMaster\\Data\\SDK\\examples\\ Python\\Linux\\lib\\libTOSUN\\windows\\x86<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"VB6.0-based\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\tAfter the new VB project will add the above dependent files to the VB project directory, add a good project folder after the files shown in Figure 2 below.\n\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"VB6.0-based\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t

2. Declare the functions in libTSCAN.dll.<\/h3>

Use the Declare statement to declare the functions in libTSCAN.dll.<\/p>

\u00a0<\/p>


The syntax is as follows:<\/strong><\/p>

Private Declare [Function|Sub] External Function Name Lib \"Library Filename\" [Alias \"Alias\"] ([Argument List])<\/strong><\/p>

private<\/strong>: Optional, indicating that the declaration is visible within the current module. If you need to use it in multiple modules, you can use Public.<\/p>

Declare<\/strong>: Keyword for declaring external functions.<\/p>

Function<\/strong>maybeSub<\/strong>: The choice is based on whether the external function returns a value (Function) or does not return a value (Sub).<\/p>

External function name: the name of the function you use in your VB6.0 code.<\/p>

Lib<\/strong>: Specifies the name of the DLL library file containing the function definition.<\/p>

Library filename: the name of the DLL library file, excluding the extension (.lib or .dll).<\/p>

Alias<\/strong>: Optional, if the function name in the DLL conflicts with the name in VB6.0 or does not conform to the naming rules of VB6.0, an alias can be used.<\/p>

\u00a0<\/p>

parameter list<\/strong>: The arguments to the function, including the name, type, and delivery method (ByVal or ByRef) of the argument.<\/p>

\u00a0<\/p>

'Load libTSCAN library, must be executed before calling other APIs'<\/em><\/p>

Private Declare Sub initialize_lib_tscan_verbose Lib \"libTSCAN.dll\" (ByVal AEnableFIFO As Boolean, ByVal AEnableErrorFrame As Boolean, ByVal AUseHWTime As Boolean, ByVal ATSType As Long)<\/em><\/p>

\u00a0<\/p>

'Releases the libTSCAN library, which must be called before exiting the program after completing its use.<\/em><\/p>

Private Declare Sub finalize_lib_tscan Lib \"libTSCAN.dll\" ()<\/em><\/p>

\u00a0<\/p>

'Query the device's manufacturer, product name, serial number, how many CAN channels it contains, whether it supports FDCAN, how many LIN channels, Flexray channels, and Ethernet channels'<\/em><\/p>

Private Declare Function tscan_get_device_info_detail Lib \"libTSCAN.dll\" (ByVal ADeviceIndex As Long, ByRef AManufacturer As Long, ByRef AProduct As Long, ByRef ASerial As Long, ByRef ADeviceType As Long, ByRef ADeviceName As Long, ByRef ACANChannelCount As Long, ByRef AIsCAN FD As Boolean, ByRef ALINChannelCount As Long, ByRef AFRChannelCount As Long, ByRef AEthernetChannelCount As Long) As Long<\/em><\/p>

\u00a0<\/p>

'Connected devices<\/em><\/p>

Private Declare Function tscan_connect Lib \"libTSCAN.dll\" (ByVal ADeviceSerial As String, ByRef AHandle As Long) As Long<\/em><\/p>


'Disconnect device<\/em><\/p>

Private Declare Function tscan_disconnect_by_handle Lib \"libTSCAN.dll\" (ByVal AHandle As Long) As Long<\/em><\/p>

\u00a0<\/p>

'Query the number of TSCAN devices currently online<\/em><\/p>

Private Declare Function tscan_scan_devices Lib \"libTSCAN.dll\" (ByRef ADeviceCount As Long) As Long<\/em><\/p>


'Configure common CAN hardware channels<\/em><\/p>

Private Declare Function tscan_config_can_by_baudrate Lib \"libTSCAN.dll\" (ByVal AHandle As Long, ByVal AChnIdx As Long, ByVal A120OhmConnected As Long, ByVal ARateKbps As Double, ByVal A120OhmConnected As Long) As Long ByVal ARateKbps As Double, ByVal A120OhmConnected As Long) As Long<\/em><\/p>

\u00a0<\/p>

'Configure FDCAN hardware channels; AControllerType[0: Normal CAN 1: ISO-FD 2: NoISO-FD] AControllerMode[0:Normal 1: ACKOff 2: Retricted 3: Internal Loop 4. External Loop]<\/em><\/p>

Private Declare Function tscan_config_canfd_by_baudrate Lib \"libTSCAN.dll\" (ByVal AHandle As Long, ByVal AChnIdx As Long, ByVal AArbRateKbps As Double, ByVal ADataRateKbps As Double, ByVal AControllerType As Long, ByVal AControllerMode As Long, ByVal A120OhmConnected As Long) As Long<\/em><\/p>

\u00a0<\/p>

'Send CAN\/CAN FD messages'<\/em><\/p>

Private Declare Function tscan_transmit_can_sync Lib \"libTSCAN.dll\" (ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN , ByVal ATimeoutMS As Long) As Long<\/em><\/p>

\u00a0<\/p>

Private Declare Function tscan_transmit_can_async Lib \"libTSCAN.dll\" (ByVal ADeviceHandle As Long, ByRef ACAN As ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN) As Long<\/em><\/p>

\u00a0<\/p>


'Cycle sends CAN\/CAN FD message<\/em><\/p>

'Add CAN cycle send message<\/em><\/p>

Private Declare Function tscan_add_cyclic_msg_can Lib \"libTSCAN.dll\" (ByVal ADeviceHandle As Long, ByRef ACAN As ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN, ByVal APeriodMS As Single) As Long<\/em><\/p>

'Delete CAN Cycle Transmit message<\/em><\/p>

Private Declare Function tscan_delete_cyclic_msg_can Lib \"libTSCAN.dll\" (ByVal ADeviceHandle As Long, ByRef ACAN As ByVal ADeviceHandle As Long, ByRef ACAN As TLIBCAN) As Long<\/em><\/p>


Note: If you need the complete VB6.0 sample project source code, you can contact TOSUN application support at any time to get it.<\/span><\/p>

\u00a0<\/p>

\u00a0<\/p>

3. Definition of the CAN \/CAN FD data structure<\/h3>

The CAN and CAN FD data structure is as follows:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"VB6.0-based\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t

4. Call interface description<\/h3>

Description of the interfaces used in the demo:<\/strong><\/p>

\u00a0<\/p>

initialize_lib_tscan_verbose<\/strong><\/p>

Function: Initialize the tscan library module. This function must be called to initialize the CAN module before other API functions can be called. This function is used in pair with finalize_lib_tscan.<\/p>

\u00a0<\/p>


Input Parameters:<\/p>

AEnableFIFO[IN]: if or not enable FIFO mechanism, it is recommended to set it to True, otherwise users can not read the message through tsfifo_receive_xx function;\u00a0<\/p>

AEnableErrorFrame[IN]: whether to receive error frames. If set to False, the driver will discard the error frame directly;<\/p>

AUseHWTime[IN]: whether to use the device connection time;<\/p>

ATSType[IN] :Set it to False and it works;<\/p>

Return value: None<\/p>

\u00a0<\/p>


finalize_lib_tscan<\/strong><\/p>

Purpose: To release the CAN module before exiting the program, paired with the create function initialize_lib_tscan.<\/p>

Input parameters: none<\/p>

Return value: None<\/p>

\u00a0<\/p>


tscan_get_device_info_detail<\/strong><\/p>

Role: Get device information<\/p>

Input Parameters:<\/p>

ADeviceIndex[IN]: device index value;<\/p>

AManufacturer [OUT]: Manufacturer;<\/p>

AProduct[OUT] : Product name;<\/p>

ASerial[OUT] : Serial number;<\/p>

ADeviceType[OUT] : Device type;<\/p>

ADeviceName[OUT] : Device name;<\/p>

ACANChannelCount[OUT] : Number of CAN channels;<\/p>

AIsCAN FD[OUT] : Whether CAN FD is supported;<\/p>

ALINChannelCount[OUT] : Number of LIN channels;<\/p>

AFRChannelCount[OUT] : Number of FR channels;<\/p>

AEthernetChannelCount[OUT] : Number of Ethernet channels;<\/p>

\u00a0<\/p>


tscan_connect<\/strong><\/p>

Function: Connects to a device and gets a unique handle to that device.<\/p>

Input Parameters:<\/p>

ADeviceSerial: get the device with the specified serial number, if the parameter is empty, it means to get any device in the connected state;<\/p>

AHandle: device handle, subsequent operations on the hardware need to be based on this unique device handle;<\/p>

\u00a0<\/p>


tscan_scan_devices<\/strong><\/p>

Role: Scanning the number of devices online<\/p>

Input Parameters:<\/p>

ADeviceCount[OUT]: returns the number of online devices;<\/p>

\u00a0<\/p>


tscan_config_can_by_baudrate<\/strong><\/p>

Function: Configure the CAN bus baud rate<\/p>

AHandle:Device handle;<\/p>

AChnIdx:Application channel number;<\/p>

ARateKbps:Baud rate;<\/p>

A120OhmConnected: whether to enable the internal termination resistor;<\/p>

\u00a0<\/p>

tscan_transmit_can_sync<\/strong><\/p>

Function: Sends a CAN message and exits the function after detecting a successful send. This function returns success, which means that the CAN telegram must have been successfully sent to the CAN bus.<\/p>

Input Parameters:<\/p>

ADeviceHandle: device handle;<\/p>

ACAN: The message data;<\/p>

ATimeoutMS: synchronization wait timeout;<\/p>

\u00a0<\/p>


tscan_transmit_can_async<\/strong><\/p>

Function: Sends CAN messages asynchronously.<\/p>

Input Parameters:<\/p>

ACAN: CAN data packet. for TLIBCAN data composition, please refer to the CAN, CAN FD data composition chapter.<\/p>

\u00a0<\/p>


tscan_add_cyclic_msg_can<\/strong><\/p>

Function: Increase the number of messages sent in a cycle<\/p>

Input Parameters:<\/p>

ADeviceHandle: Handle to the operation device.<\/p>

ACAN: CAN packet;<\/p>

APeriodMS:Period value;<\/p>

\u00a0<\/p>


tscan_delete_cyclic_msg_can<\/strong><\/p>

Function: Deletes the periodic sending of CAN messages.<\/p>

ACAN: Yes, periodic messages that need to be deleted;<\/p>

\u00a0<\/p>

tsfifo_receive_can_msgs<\/strong><\/p>

Function: Reads the message packets in the hardware cache.<\/p>

Input Parameters:<\/p>

ADeviceHandle: device handle;<\/p>

ACANBuffers: Data Buffer, used to store the read messages, the Buffer needs to be created by the function caller;<\/p>

ACANBufferSize: the size of the message buffer;<\/p>

AChn:Target channel: for multi-channel devices, this function selects which channel to read the data, this parameter can be empty, the default is channel 1;<\/p>

ARxTx:==0: only receive Rx messages; >0: Tx Rx messages are read back, this parameter can be empty, the default is to receive only Rx messages;<\/p>

\u00a0<\/p>


tsfifo_add_can_canfd_pass_filter<\/strong><\/p>

Function: Users need to call this function if they only want to receive messages with a specific ID.<\/p>

Input Parameters:<\/p>

ADeviceHandle: device handle;<\/p>

AChnIdx: channel index;<\/p>

AIdentifier: message identifier;<\/p>

AIsStd: whether standard frame;<\/p>

\u00a0<\/p>

tsfifo_delete_can_canfd_pass_filter<\/strong><\/p>

Function: Cancel message filtering<\/p>

Input Parameters:<\/p>

ADeviceHandle: device handle;<\/p>

AChnIdx: channel index;<\/p>

AIdentifier: message identifier;<\/p>

AIsStd: whether standard frame;<\/p>

\u00a0<\/p>

\u00a0<\/h3>

5.VB6.0 Demo realize effect<\/h3>

1) Click [Scan Devices], get the number of online devices and print it in the right control.<\/p>

2) Click [Query Device Information] to get the specific information of the device and print it in the right control.<\/p>

3) Click [Connect] to complete the hardware connection, print the connection success log and current device handle in the right control.<\/p>

4) Click [Configure Hardware Channel] to complete the channel and baud rate settings.<\/p>

5.) Click [Channel 1 Send Normal Message] to send 0x7B in a single frame.<\/p>

6) Click [Receive CAN message from channel 2] to read the message data in the FIFO displayed in the ListBox below.<\/p>

7) Click [Send Cycle Message] , and the message 0x29A is sent with a 50-ms cycle.<\/p>

8) Click [Stop Cycle Transmission] ,message 0x29A stops cycle transmission.<\/p>

(9) Click [Receive CAN message from channel 2], read the message data in the FIFO and display it in the ListBox below. As shown in Figure 3.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"VB6.0-based\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t
\n\t\t\t\t\t
\n\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

04. Troubleshooting (QA)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t

Q\uff1aAfter connecting, the device has been receiving messages, at this time, after I turn on filtering, then I go to send the message, when receiving the message, do I have to take out the data stored before until I read the filtered ID?<\/p>

A: Right. Adding filtering actively clears out the old cache. Clear cache function: tsfifo_clear_can_receive_buffers.<\/p>

\u00a0<\/p>

Q: What does the return value of a function mean?<\/p>

A\uff1aFunction return value is 0 means the function execution is successful, other values means the function execution fails. Specific failure reason can be described according to the TSMaster system built-in constants to look up the table. If the return value is 3, it means \"device not found\", then you should check whether the current TSCAN device is connected normally.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"VB6.0-based\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"

\u672c\u6587\u4e3b\u8981\u8bb2\u7684\u662f\uff0c\u57fa\u4e8eTSMaster \u5b9e\u73b0 TOSUN \u7cfb\u5217 CAN\/CAN FD\uff0cLIN \u8bbe\u5907\u7684\u64cd\u4f5c\u3002\u4e3b\u8981\u7ed9 […]<\/p>","protected":false},"author":11,"featured_media":12001,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":""},"categories":[90],"tags":[62,65,131,136],"class_list":{"0":"post-11998","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-software-tutorial","8":"tag-can","9":"tag-tsmaster","11":"tag-136","12":"entry","13":"has-media","14":"owp-thumbs-layout-horizontal","15":"owp-btn-normal","16":"owp-tabs-layout-horizontal","17":"has-no-thumbnails","18":"has-product-nav"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts\/11998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/comments?post=11998"}],"version-history":[{"count":0,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/posts\/11998\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/media\/12001"}],"wp:attachment":[{"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/media?parent=11998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/categories?post=11998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tosunai.com\/en\/wp-json\/wp\/v2\/tags?post=11998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}